Numpy - 常用操作总结

查看 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])
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容