import numpy as np
#生成一个两行三列的随机矩阵
arr = np.random.rand(2,3)
print(arr.dtype)
#float64
print(arr.shape)
#(2, 3)
首先可以使用np中的array方法:
arr1 = np.array([1.2,2,3,5])
#生成一个一维矩阵
print(arr1)
#[1.2 2. 3. 5. ]
print(arr1.dtype)
#float64
arr2 = np.array([[1,2,3,4],[2,2,3,4]])
#生成一个二维矩阵
print(arr2)
#[[1 2 3 4]
#[2 2 3 4]]
print(arr2.dtype)
#int32
这里除非显式指定,否则np.array会自动根据列表中的元素决定ndarray的数据类型。
还可以使用np.ones和np.zeros创建全零或者全1的矩阵:
arr3 = np.ones(10)
#创建一个一行十列的全1矩阵
arr4 = np.zeros((2,3))
#创建一个两行三列的全0矩阵
注意,当使用ones和zeros创建高阶矩阵的时候应该使用元组的形式。除非显式指定,数据类型默认为float64。
在创建ndarray对象时我们可以显式的指定其数据类型:
arr5 = np.array([1,2,3],dtype=np.float32)
print(arr5.dtype)
#float32
具体的数据类型可以参考:
numpy数据类型
可以使用astype显式的改变矩阵的数据类型:
arr6 = arr5.astype(np.int32)
#将arr5的数据类型变为int32并赋值给arr6
print(arr6.dtype)
#int32
print(arr5.dtype)
#float32
注意这里并不会改变arr5的数据类型,另外如果将浮点数换为整数,贼小数点后的数据都会消失。
也可以使用astype将表示数字含义的字符串转换为数字:
arr8 = np.array(['1.25','3.2','-7'],dtype=np.string_)
arr9 = arr8.astype(np.float64)
print(arr9)
#[ 1.25 3.2 -7. ]
print(arr9.dtype)
#float64
ndarray允许进行批量操作而无需for循环,两个尺寸相同的ndarray对象之间的运算都采用了逐元素运算的方式:
arr1 = np.array([[1,3,5],[2,4,6]])
arr2 = np.array([[2,4,6],[3,5,7]])
print(arr1+arr2)
#[[ 3 7 11]
#[ 5 9 13]]
print(arr1*arr2)
#[[ 2 12 30]
#[ 6 20 42]]
print(arr1>arr2)
#[[False False False]
#[False False False]]
带有标量的算术操作,会把计算参数传递给矩阵中的每一个元素:
print(arr1*2)
#[[ 2 6 10]
#[ 4 8 12]]
arr = np.arange(10)
print(arr)
#[0 1 2 3 4 5 6 7 8 9]
print(arr[5:8])
#[5 6 7]
#切片:从索引为5(从0开始)到索引为8之前的元素,即要头不要尾
arr[5:8] = 12
print(arr)
#[ 0 1 2 3 4 12 12 12 8 9]
*这里我们注意到,任何对切片的修改都会改变原矩阵的元素值,因为我们得到的是原数组的一个视图而不是一份拷贝。*再举一个例子:
arr = np.arange(10)
arr_slice = arr[5:8]
arr_slice[0] = 200
print(arr_slice)
#[200 6 7]
print(arr)
#[ 0 1 2 3 4 200 6 7 8 9]
如果我们想要得到原数组的一份拷贝而不是视图的话,我们需要显示的复制这个数组。
arr_slice = arr[5:8].copy()
对于高维数组,每个元素不再是一个值而是一个一维数组:
arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(arr[2])
#[7 8 9] 即数组的第二行
#我们可以通过以下两种方式访问高维数组中的元素
print(arr[2][0])
print(arr[2,0])
#均打印出7,可以理解为第2行第0列
arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(arr[:2])
#[[1 2 3]
#[4 5 6]]
#相当于将arr看作一个一维数组。:2表示索引为2之前的所有行
print(arr[:2,1:])
#[[2 3]
#[5 6]]
#1:表示从索引1开始,到之后的所有列
也可以进行混合使用,如只取第0行的0列和1列
print(arr[0,0:2])
print(arr[0,:2])
#均输出[1 2]
与一维数组的切片一样,当切片被修改后,原数组也会被修改。
可以使用bool值来访问数组:
arr = np.random.randn(4,4)
print(arr)
#生成一个4#4的随机数组
print(arr[np.array([True,True,False,False])])
#打印前两行
arr[arr<0] = 0
#先切片,得到数组中小于0的值,之后将其变为0