numpy作为Python里科学计算的库,功能非常强大,尤其是对矩阵的运算,比传统用循环的计算快很多。

矩阵的维度和shape

一组有序的数据是一维的,比如 array [1,2,3]。shape是描述各个维度数据的长度。那么对于一维数据来说,数据的shape就只有一个值。numpy里用ndim来显示维度,用shape来显示各个维度的值。


import numpy as np
arr = np.array([1,2,3])
print(arr)
print(arr.ndim)
print(arr.shape)

结果为:


[1 2 3]
1
(3,)

如果一个一维的array里装的不是数值,而是array,那么它就变成了二维的了,比如:[[1,1],[2,2],[3,3]]


arr2 = np.array([[1,1],[2,2],[3,3]])
print(arr2)
print(arr2.ndim)
print(arr2.shape)

运行的结果为:


[[1 1]
 [2 2]
 [3 3]]
2
(3, 2)

这时我们的维度为2,第一个维度有3个元素,第二个维度有2两个元素。所以结果为(3,2)。我们可以通过arr2.size来或者整个矩阵所有元素的个数。上例中arr2的size为6。

创建array

上边我们已经看到如何创建array了。np.array([1,2,3]). 除了传入数据外,你还可以传入array里数据的类型。比如:


inta = np.array([1,2,3],dtype=np.int)
print(inta)
intf = np.array([1,2,3],dtype=np.float)
print(intf)
ints = np.array([1,2,3],dtype=np.str)
print(ints)

结果为:


[1 2 3]
[1. 2. 3.]
['1' '2' '3']

你还可以通过np.zeros 和 np.ones 来生成元素全为0或者1的矩阵。


zeros = np.zeros((2,3))
ones = np.ones((2,3))
print(zeros)
print(ones)

结果为:


[[0. 0. 0.]
 [0. 0. 0.]]
 
[[1. 1. 1.]
 [1. 1. 1.]]

你还可以通过arange来生成一个序列的数组,arange有三个参数:起始值,终止值(不包含),步长(可选):


range1 = np.arange(1,10)
print(range)
range2 = np.arange(1,10,2)
print(range2)

结果是:


[1 2 3 4 5 6 7 8 9]
[1 3 5 7 9]

如果你不关心步长,你只关心从1到10,生成8个值。计算步长比较麻烦,那么我们可以用np.linspace来帮我们生成一个array。它需要指定3个参数,起始值(包含),终止值(包含),生成几个数。


print(np.linspace(1,10,8))

结果是:


[ 1.          2.28571429  3.57142857  4.85714286  6.14285714  7.42857143
  8.71428571 10.        ]

reshape重构

reshape 方法可以改变array的维度和shape:


shape1 = np.arange(1,9)
print(shape1)
shape2 = shape1.reshape(8,1)
print(shape2)
shape3 = shape2.reshape(2,4)
print(shape3)

结果是:


[1 2 3 4 5 6 7 8]

[[1]
 [2]
 [3]
 [4]
 [5]
 [6]
 [7]
 [8]]
 
[[1 2 3 4]
 [5 6 7 8]]

Array元素的访问


arr = np.arange(1,9).reshape((2,4))
print(arr)
print(arr[0])
print(arr[0,0])
arr[0,0]=2
print(arr[0,0])
print(arr[:,1:-1])

结果为:


[[1 2 3 4]
 [5 6 7 8]]
 
[1 2 3 4]

1

2

[[2 3]
 [6 7]]

其中arr[0,0]也可以写作arr[0][0]。上边例子中我们看到arr[0]是一个一维数组。我们可以通过下表读取和修改元素,并且可以使用python中的:来操作多维数组。

数组还是矩阵

如果你直接用np.array([1,2,3])你生成的是一个array,不是一个矩阵,但是numpy里很多操作是针对矩阵的,比如矩阵的转置。所以如果你想要生成的是一个矩阵,参与后续的运算,你最好在声明的时候就明确指定它的行列,即使为1。或者用reshape(1,3)来把[1,2,3]转化为一个矩阵[[1,2,3]]

发表评论

电子邮件地址不会被公开。 必填项已用*标注

%d 博主赞过: