查看 numpy 的使用版本
>> import numpy as np
>> np.__version__
'1.19.4'
构造一个全 0 矩阵,并查看其占用的内存大小
>> arr = np.zeros((3,4))
>> arr
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
>> arr.nbytes
96
>> arr.size * arr.itemsize
96
默认构造的全 0 矩阵为 float64 类型,即一个元素就占用 8 字节。
>> arr.dtype
dtype('float64')
创建一个 0-9 的数组,并倒序排列
>> np.arange(0,10,1)[::-1]
array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
返回非 0 元素的索引位置
>> arr = np.random.randint(0,2,10)
>> arr
array([1, 0, 1, 1, 0, 1, 1, 0, 1, 0])
>> np.nonzero(arr)
(array([0, 2, 3, 5, 6, 8], dtype=int64),)
也可以是多维数组:
>> arr.shape = 2,5
>> arr
array([[1, 0, 1, 1, 0],
[1, 1, 0, 1, 0]])
>> np.nonzero(arr)
(array([0, 0, 0, 1, 1, 1], dtype=int64),
array([0, 2, 3, 0, 1, 3], dtype=int64))
>> arr[np.nonzero(arr)]
array([1, 1, 1, 1, 1, 1])
构造一个 3 * 3 的随机矩阵,并打印其最大值与最小值
>> arr = np.random.rand(3,3)
>> arr
array([[0.6347373 , 0.56058606, 0.31188817],
[0.48693183, 0.71480103, 0.90942481],
[0.64341795, 0.40233619, 0.98024959]])
>> arr.max()
0.9802495876827386
>> arr.min()
0.3118881668228354
np.random.rand 返回 [0-1) 之间的浮点数数组,np.random.random 也可以返回同样的数组,只不过两者接受的参数不同:
>> arr = np.random.random((3,3))
>> arr
array([[0.50340633, 0.00210532, 0.1846213 ],
[0.18687105, 0.83296656, 0.41537543],
[0.02376818, 0.97672917, 0.42673304]])
>> arr.min()
0.002105321937459048
>> arr.max()
0.9767291726794173
构造一个 5*5 的矩阵,令其值都为 1,并在最外层加上一圈 0
np.pad 用于填充数组,最常见的操作就是进行边缘填充。
>> arr = np.ones((5,5))
>> arr
array([[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.]])
>> arr = np.pad(arr, pad_width=1, mode='constant', constant_values=0)
>> arr
array([[0., 0., 0., 0., 0., 0., 0.],
[0., 1., 1., 1., 1., 1., 0.],
[0., 1., 1., 1., 1., 1., 0.],
[0., 1., 1., 1., 1., 1., 0.],
[0., 1., 1., 1., 1., 1., 0.],
[0., 1., 1., 1., 1., 1., 0.],
[0., 0., 0., 0., 0., 0., 0.]])
找出 (6,8,10) 形状的数组中,第 98 个元素的索引位置:
>> np.unravel_index((6,8,10), 98)
(array([ 6, 8, 10], dtype=int64),)
对一个数组进行归一化操作
>> arr = np.random.randint(10, 100, size=(3,4))
>> arr
array([[45, 29, 94, 33],
[76, 84, 61, 72],
[27, 77, 27, 40]])
>> arr = (arr - arr.min()) / (arr.max() - arr.min())
>> arr
array([[0.26865672, 0.02985075, 1. , 0.08955224],
[0.73134328, 0.85074627, 0.50746269, 0.67164179],
[0. , 0.74626866, 0. , 0.19402985]])
计算数组的交集、并集、补集
>> arr1 = np.random.randint(0,10,10)
>> arr1
array([9, 5, 9, 3, 3, 9, 9, 5, 3, 6])
>> arr2 = np.random.randint(0,10,10)
array([5, 6, 3, 5, 6, 4, 5, 7, 4, 0])
计算交集:
>> np.intersect1d(arr1, arr2)
array([3, 5, 6])
>> np.intersect1d(arr1, arr2, return_indices=True)
(array([3, 5, 6]),
array([3, 1, 9], dtype=int64),
array([2, 0, 1], dtype=int64))
计算并集:
>> np.union1d(arr1, arr2)
array([0, 3, 4, 5, 6, 7, 9])
计算补集:
>> np.setdiff1d(arr1, arr2)
array([9])
>> np.setdiff1d(arr2, arr1)
array([0, 4, 7])
对称补集:
>> np.setxor1d(arr1, arr2)
array([0, 4, 7, 9])
numpy 时间的相关操作
获取今天的日期:
>> today = np.datetime64('today', 'D')
>> today
numpy.datetime64('2021-09-15')
昨天日期:
>> today - np.timedelta64(1, 'D')
numpy.datetime64('2021-09-14')
明天日期:
>> today + np.timedelta64(1, 'D')
numpy.datetime64('2021-09-16')
后天的日期:
>> today + np.timedelta64(2, 'D')
numpy.datetime64('2021-09-17')
返回一个月中的所有天:
>> np.arange('2021-09', '2021-10', dtype='datetime64[D]')
array(['2021-09-01', '2021-09-02', '2021-09-03', '2021-09-04',
'2021-09-05', '2021-09-06', '2021-09-07', '2021-09-08',
'2021-09-09', '2021-09-10', '2021-09-11', '2021-09-12',
'2021-09-13', '2021-09-14', '2021-09-15', '2021-09-16',
'2021-09-17', '2021-09-18', '2021-09-19', '2021-09-20',
'2021-09-21', '2021-09-22', '2021-09-23', '2021-09-24',
'2021-09-25', '2021-09-26', '2021-09-27', '2021-09-28',
'2021-09-29', '2021-09-30'], dtype='datetime64[D]')
四舍五入和取整
>> arr = np.random.uniform(0,10,10)
>> arr
array([6.8774603 , 7.91594526, 3.75441316, 8.68713317, 9.75218066,
1.79504389, 8.10039388, 4.08137098, 9.78720106, 9.85885007])
>> np.floor(arr)
array([6., 7., 3., 8., 9., 1., 8., 4., 9., 9.])
>> np.round(arr,decimals=2)
array([6.88, 7.92, 3.75, 8.69, 9.75, 1.8 , 8.1 , 4.08, 9.79, 9.86])
只读数组
>> arr
array([6.8774603 , 7.91594526, 3.75441316, 8.68713317, 9.75218066,
1.79504389, 8.10039388, 4.08137098, 9.78720106, 9.85885007])
>> arr.flags.writeable = False
>> arr[0] = 0
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-142-753ac049a99c> in <module>()
1 arr.flags.writeable = False
----> 2 arr[0] = 0
ValueError: assignment destination is read-only
全部打印与部分打印
>> arr = np.random.randint(0,10,100)
>> arr.shape = 10, 10
>> arr
array([[7, 4, 5, 4, 8, 7, 3, 8, 0, 7],
[5, 9, 4, 6, 1, 6, 6, 1, 7, 8],
[8, 6, 2, 7, 3, 4, 2, 4, 3, 2],
[7, 2, 9, 9, 2, 2, 5, 9, 4, 4],
[9, 2, 5, 9, 6, 1, 7, 3, 9, 3],
[9, 0, 3, 6, 4, 7, 2, 4, 1, 9],
[2, 2, 2, 7, 4, 6, 2, 0, 2, 4],
[9, 0, 4, 9, 7, 8, 8, 0, 0, 1],
[7, 7, 0, 3, 1, 7, 7, 6, 7, 4],
[8, 7, 8, 0, 6, 4, 5, 5, 1, 7]])
>> np.set_printoptions(threshold=5)
>> arr
array([[7, 4, 5, ..., 8, 0, 7],
[5, 9, 4, ..., 1, 7, 8],
[8, 6, 2, ..., 4, 3, 2],
...,
[9, 0, 4, ..., 0, 0, 1],
[7, 7, 0, ..., 6, 7, 4],
[8, 7, 8, ..., 5, 1, 7]])
找到 ndarray 中距离指定数字最近的值
>> arr = np.arange(100)
>> number = np.random.uniform(0,100)
>> number
11.644091465790861
>> index = np.abs(arr-number).argmin()
>> index
12
>> arr[index]
12
遍历 ndarray 元素索引与对应位置的值
arr = np.arange(6).reshape(2,3)
for index, value in np.ndenumerate(arr):
print(index, value)
运行结果:
(0, 0) 0
(0, 1) 1
(0, 2) 2
(1, 0) 3
(1, 1) 4
(1, 2) 5
数组数据类型转换
>> arr.dtype = np.float32
>> arr.dtype
dtype('float32')
>> arr = arr.astype(np.int32)
>> arr.dtype
dtype('int32')
按照数组中的某一列进行排序
>> arr = np.random.randint(0,10,(3,4))
>> arr
array([[1, 4, 5, 9],
[6, 8, 4, 3],
[4, 6, 1, 0]])
>> index = arr[:,2].argsort()
>> index
array([2, 1, 0], dtype=int64)
>> arr[index]
array([[4, 6, 1, 0],
[6, 8, 4, 3],
[1, 4, 5, 9]])
统计数组中值出现的次数
>> arr = np.random.randint(0,3,10)
>> arr
array([1, 0, 1, 0, 2, 2, 0, 1, 0, 0])
>> np.bincount(arr)
array([5, 3, 2], dtype=int64)
>> arr.sort()
>> arr
array([0, 0, 0, 0, 0, 1, 1, 1, 2, 2])
显然 0 出现了 5 次,1 出现了 3 次,最后 2 出现了 2 次。
对一个思维数组的最后两维求和
>> arr = np.random.uniform(0,100,(4,4,4,4))
>> arr.sum(axis=(-2,-1))
array([[837.95357388, 958.44018891, 858.66962161, 886.17054313],
[846.35178588, 796.52872469, 704.61152743, 735.41751835],
[959.57896531, 809.9788935 , 908.57176392, 821.14186403],
[851.11457603, 661.7959177 , 983.46047103, 817.20064634]])
本来是 4 维数组,对最后 2 维进行了求和,最后剩下的是 2 维素组。
交换矩阵中的两行
>> arr = np.arange(9).reshape(3,3)
>> arr
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>> arr[[0,2]] = arr[[2,0]]
>> arr
array([[6, 7, 8],
[3, 4, 5],
[0, 1, 2]])
快速查找 TOP N
>> arr = np.arange(10000)
>> np.random.shuffle(arr)
>> n = 3
>> arr[np.argpartition(-arr, n)[:n]]
array([9999, 9998, 9997])