Python 2D NumPy 数组理解

Posted

技术标签:

【中文标题】Python 2D NumPy 数组理解【英文标题】:Python 2D NumPy array comprehension 【发布时间】:2015-08-13 16:24:36 【问题描述】:

我是 NumPy 的新手。我有一个包含浮点值的二维 NumPy 数组。我希望在整个矩阵中获得大于某个值的 70% 的那些元素的索引,比如 t

output = [(1,2),(4,7),(7,1)] 表示 arr[1][2]arr[4][7]arr[7][1] 的值大于 70 t

的百分比

使用 2 个循环来完成工作是一种相当简单的方法。完成它的最 Pythonic 方式是什么(列表理解等)?请指出任何重复项。谢谢!

【问题讨论】:

Numpy 的where 在这里听起来很相关,看看吧。 给出该示例案例的其余部分,包括您的循环。顺便说一句,对于numpy,我们通常索引:arr[1,2],而不是arr[1][2] @hpaulj 抱歉,没明白你的意思。样例如 ?我只有一个想要遍历的二维数组。 注意:通常,计算实际索引是不必要的开销。我在这里看到的大多数对where 的调用都可以简单地删除而不会影响程序的行为,并且代码会运行得更快。 【参考方案1】:

一个例子:

In [76]: arr=np.arange(20, dtype=float).reshape(4,5)

In [77]: arr
Out[77]: 
array([[  0.,   1.,   2.,   3.,   4.],
       [  5.,   6.,   7.,   8.,   9.],
       [ 10.,  11.,  12.,  13.,  14.],
       [ 15.,  16.,  17.,  18.,  19.]])

可以从数组中选择值的布尔索引

In [79]: arr>15
Out[79]: 
array([[False, False, False, False, False],
       [False, False, False, False, False],
       [False, False, False, False, False],
       [False,  True,  True,  True,  True]], dtype=bool)

In [80]: arr[arr>15]
Out[80]: array([ 16.,  17.,  18.,  19.])

条件为真的索引,也可以用来选择元素

In [81]: I=np.nonzero(arr>15)

In [82]: I
Out[82]: (array([3, 3, 3, 3], dtype=int32), array([1, 2, 3, 4], dtype=int32))

In [83]: arr[I]
Out[83]: array([ 16.,  17.,  18.,  19.])

或者将索引元组变成对列表

In [84]: list(zip(*I))
Out[84]: [(3, 1), (3, 2), (3, 3), (3, 4)]

In [87]: [arr[j] for j in zip(*I)]
Out[87]: [16.0, 17.0, 18.0, 19.0]

【讨论】:

以上是关于Python 2D NumPy 数组理解的主要内容,如果未能解决你的问题,请参考以下文章

Python之NumPy(axis=0/1/2...)的透彻理解

如何理解外行人的坎坷步伐?

python使用numpy中的diagonal函数获取2D numpy数组的对角线元素使用numpy中的diagonal函数和sum函数获取2D numpy数组的迹(matrix trace)

Python: 向量矩阵和多维数组(基于NumPy库)

图解NumPy,这是理解数组最形象的一份教程了

Python将numpy数组的列表转换为2d数组