我正在尝试使用1-dim数组的值来切换/返回Numpy中2-dim数组中的行和列。例如,假设我有以下一个暗淡的数组: [1,3,5)] 和以下2个暗淡的数组:
array([[1, 0, 0, 0, 0, 0],
[0, 4, 0, 0, 0, 1],
[0, 0, 3, 0, 0, 0],
[0, 1, 0, 7, 0, 10],
[0, 0, 0, 0, 8, 0],
[0, 2, 0, 0, 0, 9]])
如何退回以下内容:
array([[4, 0, 1],
[1, 7, 10],
[2, 0, 9]])
我还希望能够使用相同的示例生成6x6掩模。所以我会得到这个:
array([[True, True, True, True, True, True],
[True, False, True, False, True, False],
[True, True, True, True, True, True],
[True, False, True, False, True, False],
[True, True, True, True, True, True],
[True, False, True, False, True, False]],)
我尝试了许多不同的东西,似乎没有什么能得到我需要的东西。我知道我可以通过写几个循环来做到这一点,但我认为必须有一个更简单的方法。我也做过一些搜索但仍然没有运气。提前谢谢!
答案 0 :(得分:4)
这是你想要的吗?
>>> a = array([[1, 0, 0, 0, 0, 0],
... [0, 4, 0, 0, 0, 1],
... [0, 0, 3, 0, 0, 0],
... [0, 1, 0, 7, 0, 10],
... [0, 0, 0, 0, 8, 0],
... [0, 2, 0, 0, 0, 9]])
>>>
>>> a[1::2,1::2]
array([[ 4, 0, 1],
[ 1, 7, 10],
[ 2, 0, 9]])
由于您的步幅访问是如此常规,您可以通过基本切片来完成此操作。至于面具:
>>> a = np.ones(a.shape,dtype=bool)
>>> a[1::2,1::2] = False
>>> a
array([[ True, True, True, True, True, True],
[ True, False, True, False, True, False],
[ True, True, True, True, True, True],
[ True, False, True, False, True, False],
[ True, True, True, True, True, True],
[ True, False, True, False, True, False]], dtype=bool)
当然,这个答案假设你想要沿轴的所有其他元素(从索引1开始)。您可以修改切片以在索引为6时停止:a[1:6:2,1:6:2]
或者取每个第3个元素a[1::3,1::3]
,但如果您需要随机访问数组,则会变得有点困难...... < / p>
您可以这样做:
>>> b = [1,3,5]
>>> a[:,b][b]
array([[ 4, 0, 1],
[ 1, 7, 10],
[ 2, 0, 9]])
>>> a[b][:,b] #I think the same thing, but depending on data layout, one may be faster than the other
array([[ 4, 0, 1],
[ 1, 7, 10],
[ 2, 0, 9]])
此时,您可能正在制作数组的副本,而不仅仅是获取视图。这效率较低,你将无法使用它来构造布尔掩码,就像我之前认为的那样。
答案 1 :(得分:1)
可能对例程np.meshgrid()有用:
a = array([[1, 0, 0, 0, 0, 0],
[0, 4, 0, 0, 0, 1],
[0, 0, 3, 0, 0, 0],
[0, 1, 0, 7, 0, 10],
[0, 0, 0, 0, 8, 0],
[0, 2, 0, 0, 0, 9]])
b = np.array([1, 3, 5])
B = np.meshgrid(b,b)
print a[B].T
Out: [[ 4 0 1]
[ 1 7 10]
[ 2 0 9]]
我认为这是理想的结果。
答案 2 :(得分:0)
如果您将大数组放在a
中,将小数组放在i
中,则可以使用a[i][...,i]
进行切片。可能还有一种方法可以一步到位,但我还不足以知道它。
答案 3 :(得分:0)
mgilson's answer就是您想要的。但是,如果a
是您的数组,并且您希望获得某些1-D数组a[i, j]
中所有i
和j
的{{1}},那么一件事。
b
问题在于,这只会获得元素(1,1),(3,3)和(5,5)。如果您尝试在单独的步骤中进行索引,
In : a = array([[1, 0, 0, 0, 0, 0],
[0, 4, 0, 0, 0, 1],
[0, 0, 3, 0, 0, 0],
[0, 1, 0, 7, 0, 10],
[0, 0, 0, 0, 8, 0],
[0, 2, 0, 0, 0, 9]])
In : b = np.array([1, 3, 5])
In : a[b, b]
Out: array([4, 7, 9])
出现此错误是因为我将同一轴索引两次。这些工作都是:
In : a[b][b]
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-87-c3c286c42537> in <module>()
----> 1 a[b][b]
IndexError: index 3 is out of bounds for axis 0 with size 3
In : a[b][:, b]
Out:
array([[ 4, 0, 1],
[ 1, 7, 10],
[ 2, 0, 9]])
In : a[:, b][b]
Out:
array([[ 4, 0, 1],
[ 1, 7, 10],
[ 2, 0, 9]])
选出行,[b]
选出列;这些索引操作可以交换。