2013-06-19 26 views
0

我想使用1-dim数组的值从Numpy中的2-dim数组中切片/返回行和列。例如,假设我有以下的一个维数组: [1,3,5) 和下面的2维数组:使用来自Numpy中的1d数组的值返回2d数组中的行和列

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]],) 

我已经尝试了很多不同的东西,似乎没有得到正是我需要的。我知道我可以通过编写几个循环来实现,但我认为必须有一个更简单的方法。我也做了一些搜索,但仍然没有运气。提前致谢!

回答

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],但如果你需要随机访问数组,变得有点困难......

你可以这样做这个:

>>> 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]]) 

在这一点上,虽然,你可能做了一个数组的副本,而不是仅仅得到一个视图。这是效率较低,你不能像我们以前所做的那样使用它来构造布尔掩码。

+0

+1但是'a [b] [:, b]'与'a [b [:,无],b]'或者其他类似的变体例如'a [b.reshape(-1, 1),b]',并且可以让你实例化一个中间数组。 – Jaime

+0

太棒了!不,我的步幅访问不规则,所以这:a [:,b] [b]的作品。我只是用一个很容易遵循的例子。我的真实数据更大,而且不规则。就像你说的,这对制作面具不起作用。有什么建议么?再次感谢! – user2503169

+0

我想返回a的平均值和最大值,只有那些在b中有行/列位置的单元格,并且在给定掩码的情况下知道a中最大值的索引是很好的。 – user2503169

0

如果你把你的大数组放在a和你的小数组中i,你可以用a[i][...,i]做切片。可能还有一种方法可以一步完成,但我还不足以让一个矮胖的巫师了解它。

0

mgilson's answer是你想要的,如果你知道步伐是正常的。但是,如果a是您的阵列,并且您想在某些1-D阵列b中获得a[i, j]的所有ij,则有一个问题。

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]) 

的问题是,这只是让你的元素(1,1),(3,3)和(5,5)。如果您尝试在单独的步骤中执行索引,则

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]挑选出来的行,[:, b]挑选出列;这些索引操作可以交换。

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]] 

我认为这是期望的结果。

相关问题