【问题标题】:using boolean array for indexing in numpy for 2D arrays使用布尔数组在 numpy 中对二维数组进行索引
【发布时间】:2019-08-31 20:11:27
【问题描述】:

我使用布尔索引从 numpy 数组中选择元素为

x = y[t<tmax]

其中 t 是一个包含与 y 一样多的元素的 numpy 数组。我的问题是如何对 2D numpy 数组做同样的事情?我试过了

x = y[t<tmax][t<tmax]

但这似乎不起作用,因为它似乎首先选择了行,然后抱怨第二个选择的维度错误。

IndexError: boolean index did not match indexed array along dimension 0; dimension is 50 but corresponding boolean dimension is 200
#

这是一个例子

x1D = np.array([1,2,3], np.int32)
x2D = np.array([[1,2,3],[1,2,3],[1,2,3]], np.int32)
print(x1D[x1D<3]) --> [1 2]
print(x2D[x1D<3][x1D<3]) --> error

第二个 print 语句产生与上面所示错误类似的错误。我用

print(x2D[x1D<3])

我明白了

[[1 2 3]
 [1 2 3]]

但我想要

[[1 2]
 [1 2]]

【问题讨论】:

  • y[t&lt;tmax] 也适用于二维数组。你能用一个样本来说明什么是不工作的吗?
  • 这里的t 是什么?也是二维数组?
  • Python 独立处理每个索引操作[]temp[t&lt;tmax] 后跟 x=temp[t&lt;tmax]。所以每一步都必须自己有意义。

标签: python arrays numpy


【解决方案1】:
In [28]: x1D = np.array([1,2,3], np.int32) 
    ...: x2D = np.array([[1,2,3],[1,2,3],[1,2,3]], np.int32) 

一维蒙版:

In [29]: x1D<3                                                                                               
Out[29]: array([ True,  True, False])

应用于一维数组(大小相同):

In [30]: x1D[_]                                                                                              
Out[30]: array([1, 2], dtype=int32)

应用于 2d 它选择 2 行:

In [31]: x2D[_29]                                                                                            
Out[31]: 
array([[1, 2, 3],
       [1, 2, 3]], dtype=int32)

它可以再次用于选择列 - 但请注意行索引的 : 占位符:

In [32]: _[:, _29]                                                                                           
Out[32]: 
array([[1, 2],
       [1, 2]], dtype=int32)

如果我们从那个掩码生成一个索引数组,我们可以一步完成索引:

In [37]: idx = np.nonzero(x1D<3)                                                                             
In [38]: idx                                                                                                 
Out[38]: (array([0, 1]),)
In [39]: x2D[idx[0][:,None], idx[0]]                                                                         
Out[39]: 
array([[1, 2],
       [1, 2]], dtype=int32)

编写此“2d”索引的另一种方法:

In [41]: x2D[ [[0],[1]], [[0,1]] ]                                                                           
Out[41]: 
array([[1, 2],
       [1, 2]], dtype=int32)

ix_ 是调整索引尺寸的便捷工具:

In [42]: x2D[np.ix_(idx[0], idx[0])]                                                                         
Out[42]: 
array([[1, 2],
       [1, 2]], dtype=int32)

或者将布尔掩码传递给ix_

In [44]: np.ix_(_29, _29)                                                                                    
Out[44]: 
(array([[0],
        [1]]), array([[0, 1]]))
In [45]: x2D[np.ix_(_29, _29)]                                                                               
Out[45]: 
array([[1, 2],
       [1, 2]], dtype=int32)

In[32],所以它接近你的尝试:

In [46]: x2D[x1D<3][:, x1D<3]                                                                                
Out[46]: 
array([[1, 2],
       [1, 2]], dtype=int32)

【讨论】:

    猜你喜欢
    • 2018-07-06
    • 1970-01-01
    • 2020-07-30
    • 2013-07-20
    • 2012-04-10
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多