我想使用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]])
答案 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数组。生成器用于列表的懒惰评估,或者更确切地说是几层列表。