创建ndarray
1. 使用array函数
data1 = [[1,2,3,4],[5,6,7,8]]
arr1 = np.array(data1)
>> print arr1
array([[1,2,3,4],
[5,6,7,8]])
>> print arr1.ndim
2
>> print arr1.shape
(2,4)
>> print arr1.dtype
dtype('int64')
2. 使用数组创建函数
函数 | 说明 |
---|---|
array | 将输入数据(列表、元组、数组或其他序列类型)转换为ndarray |
asarray | 将输入转换为ndarray,如果输入本身就是一个ndarray就不进行复制 |
arange | 类似于内置的range,但返回一个ndarray而不是列表 |
ones、ones_like | 根据指定的形状和dtype创建一个全1数组。ones_like以另一个数组为参数,根据其形状和dtype创建一个全1数组 |
zeros、zeros_like | 同上,产生全0数组 |
empty、empty_like | 创建新数组,只分配内存空间但不填充值 |
eye、identity | 创建一个正方的N * N单位矩阵(对角线为1,其余0) |
例如:
np.zeros(5)
np.zeros((3, 6))
np.empty((2, 3, 2))
np.arange(10)
ndarray的数据类型
通过astype方法显示地转换其dtype
arr = np.array([1.2, 3.7, -2.6, 0.5])
>> arr.dtype
dtype('float64')
arr.astype(np.int32)
>> arr
array([1, 3, -2, 0], dtype=int32)
也可以直接调用已有的数组dtype
arr1 = np.arange(10)
arr2 = np.array([1, 2, 3], dtype=np.float64)
arr1.astype(arr2.dtype)
索引和切片
1. 基本的索引和切片
# 一维数组
arr = np.arange(10)
>> arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>> arr[5:8]
array([5, 6, 7])
arr[5:8] = 12
>> arr
array([0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
# 数组切片是原始数组的视图,意味着数据不会被复制,视图上的任何修改都会直接反映到源数组上
arr_slice = arr[5:8]
arr_slice[1] = 123
>> arr
array([0, 1, 2, 3, 4, 12, 123, 12, 8, 9])
# 如果想得到的是切片的一份副本而非视图,就要显式地进行复制操作
arr_slice = arr[5:8].copy()
# 多维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
>> arr2[0]
array([1, 2, 3])
>> arr2[0, 2]
3
>> arr2[:2]
array([1, 2, 3],
[4, 5, 6])
>> arr2[:2, 1:]
array([2, 3],
[5, 6])
2. 布尔型索引
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
data = randn(7, 4) #randn生成正态分布的随机数据
>> data
array([[-0.048, 0.5433, -0.2349, 1.2792],
[-0.268, 0.5465, 0.0939, -2.0445],
[-0.047, -2.026, 0.7719, 0.3103],
[2.1452, 0.8799, -0.0523, 0.0672],
[-1.0023, -0.1698, 1.1503, 1.7289],
[0.1913, 0.4544, 0.4519, 0.5535],
[0.5994, 0.8174, -0.9297, -1.2564]])
>> names == 'Bob'
array([ True, False, False, True, False, False, False], dtype=bool)
# 这个布尔型数组可用于数组索引,布尔型数组长度必须和索引的轴长度一致
>> data[names == 'Bob']
array([[-0.048, 0.5433, -0.2349, 1.2792],
[2.1452, 0.8799, -0.0523, 0.0672]])
# 可以使用不等于符号,负号,对条件进行否定
data[names != 'Bob']
data[-(names == 'Bob')]
# 可以将data中所有负值设为0
data[data < 0] = 0
3. 花式索引
arr = np.arange(32).reshape((8, 4))
>> arr
array([0, 1, 2, 3],
[4, 5, 6, 7],
[8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23],
[24, 25, 26, 27],
[28, 29, 30, 31])
# 选取元素(1,0) (5,3) (7,1) (2,2)
>> arr[[1, 5, 7, 2],[0, 3, 1, 2]]
array([4, 23, 29 , 10])
# 选取矩阵的行列子集
>> arr[[1, 5, 7, 2],[ : , 0, 3, 1, 2]]
array([[4, 7, 5, 6],
[20, 23, 21, 22],
[28,31, 29, 30],
[8, 11, 9, 10]])
# 使用np.ix_函数,它可以将两个一维证书数组转换为一个用于选取方形区域的索引器
>> arr[np.ix_([1, 5, 7, 2],[0, 3, 1, 2])]
array([[4, 7, 5, 6],
[20, 23, 21, 22],
[28,31, 29, 30],
[8, 11, 9, 10]])
数组转置和轴对换
1. T属性
arr = np.random.randn(6, 3)
np.dot(arr.T, arr) #np.dot计算矩阵内积
2. transpose函数
arr = np.arange(16).reshape((2, 2, 4))
>> arr
arrary([[[0, 1, 2, 3],
[4, 5, 6, 7]],
[[8, 9, 10, 11],
[12, 13, 14, 15]]])
>> arr.transpose((1, 0, 2))
arrary([[[0, 1, 2, 3],
[8, 9, 10, 11]],
[[4, 5, 6, 7],
[12, 13, 14, 15]]])
3. swapaxes函数(轴对换)
>> arr
array([[0, 1, 2, 3],
[4, 5, 6, 7]],
[[8, 9, 10, 11],
[12, 13, 14, 15]])
# 把轴1,2进行互换, 原本的shape(2,2,4)变为(2,4,2)
>> arr.swapaxes(1, 2)
array([[[0, 4],
[1, 5],
[2, 6],
[3, 7]],
[[8, 12],
[9, 13],
[10, 14],
[11, 15]]])