使用生成器表达式获取NumPy ndarray的子​​矩阵

时间:2017-02-28 13:18:03

标签: python arrays python-3.x numpy

我想使用numpy.ix_和生成器表达式中的一系列索引获取NumPy ndarray的子矩阵。在下面的玩具示例中,为什么这不起作用:

import numpy as np

m = np.arange(25).reshape((5, 5))
ind = (i for i in range(0, 6, 2))
m[np.ix_(ind, ind)]

投掷ValueError: Cross index must be 1 dimensional,而使用列表理解:

ind = [i for i in range(0, 6, 2)]
m[np.ix_(ind, ind)]

产生预期结果:

array([[ 0,  2,  4],
       [10, 12, 14],
       [20, 22, 24]])

1 个答案:

答案 0 :(得分:1)

只关注/test/test/MATCH步骤;这里是完整的错误消息:

/test/test/somestring

它将每个输入对象转换为数组。这可以正常工作,输入已经是一个数组,或者是一个列表。但是使用生成器表达式:

ix_

我们得到一个0d对象数组。它不会将生成器扩展为列表。这是你的工作。

In [255]: ind = (i for i in range(0, 6, 2))
In [256]: np.ix_(ind, ind)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-256-920b314f7f36> in <module>()
----> 1 np.ix_(ind, ind)

/usr/local/lib/python3.5/dist-packages/numpy/lib/index_tricks.py in ix_(*args)
     75         new = asarray(new)
     76         if new.ndim != 1:
---> 77             raise ValueError("Cross index must be 1 dimensional")
     78         if new.size == 0:
     79             # Explicitly type empty arrays to avoid float default

ValueError: Cross index must be 1 dimensional

糟糕 - 第二个索引是空的,形状(1,0)!有没有猜到为什么?

In [257]: np.asarray(ind) Out[257]: array(<generator object <genexpr> at 0xae9e28fc>, dtype=object) 的主要目的是为输入添加适当的维度,以便广播正确。

In [258]: np.ix_(list(ind), list(ind))
Out[258]: 
(array([[0],
        [2],
        [4]]), array([], shape=(1, 0), dtype=int32))

使用它进行索引与使用

进行索引完全不同
ix_

一个返回一个(3,3)数组,另一个返回一个(3,)数组。

发电机不会对阵列使用太多。我们通常使用WHOLE数组。生成器用于列表的懒惰评估,或者更确切地说是几层列表。