Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays NumPy数组索引和替换_Arrays_Numpy_Scipy_Scikit Image - Fatal编程技术网

Arrays NumPy数组索引和替换

Arrays NumPy数组索引和替换,arrays,numpy,scipy,scikit-image,Arrays,Numpy,Scipy,Scikit Image,我有一个3d numpy阵列,如下所示: (3L, 5L, 5L) 例如,如果一个元素位于三维位置,则存在[150、160、170]。如何将它们全部转换为[0,0,0] import numpy as np a = np.ones((3,5,5)) a[0,2:4,2:4] = 150 a[0,0:1,0:1] = 150 #important! a[1,2:4,2:4] = 160 a[2,2:4,2:4] = 170 print a 预期结果应该是: [[[ 1. 1. 1. 1.

我有一个3d numpy阵列,如下所示:

(3L, 5L, 5L)
例如,如果一个元素位于三维位置,则存在
[150、160、170]
。如何将它们全部转换为
[0,0,0]

import numpy as np
a = np.ones((3,5,5))
a[0,2:4,2:4] = 150
a[0,0:1,0:1] = 150 #important!
a[1,2:4,2:4] = 160
a[2,2:4,2:4] = 170
print a
预期结果应该是:

[[[ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]
  [ 1.  1.  0.  0.  1.]
  [ 1.  1.  0.  0.  1.]
  [ 1.  1.  1.  1.  1.]]

 [[ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]
  [ 1.  1.  0.  0.  1.]
  [ 1.  1.  0.  0.  1.]
  [ 1.  1.  1.  1.  1.]]

 [[ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]
  [ 1.  1.  0.  0.  1.]
  [ 1.  1.  0.  0.  1.]
  [ 1.  1.  1.  1.  1.]]]

首先,我将转换为一组三元组:

b = np.reshape(a.transpose(2, 1, 0), [25,3])
然后找到所需的值:

idx = np.where((b == np.array([150, 160, 170])).all(axis=1))
b[idx] = 0
并替换为您想要的任何值:

idx = np.where((b == np.array([150, 160, 170])).all(axis=1))
b[idx] = 0
最后转换回原始形状:

c = np.reshape(b, [5, 5, 3]).transpose(2, 1, 0) 

首先,我将转换为一组三元组:

b = np.reshape(a.transpose(2, 1, 0), [25,3])
然后找到所需的值:

idx = np.where((b == np.array([150, 160, 170])).all(axis=1))
b[idx] = 0
并替换为您想要的任何值:

idx = np.where((b == np.array([150, 160, 170])).all(axis=1))
b[idx] = 0
最后转换回原始形状:

c = np.reshape(b, [5, 5, 3]).transpose(2, 1, 0) 

构建您的
a

In [48]: a=np.ones((3,5,5))    
In [49]: a[0,2:4,2:4]=150
In [50]: a[1,2:4,2:4]=160
In [51]: a[2,2:4,2:4]=170

In [52]: a
Out[52]: 
array([[[   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,  150.,  150.,    1.],
        [   1.,    1.,  150.,  150.,    1.],
        [   1.,    1.,    1.,    1.,    1.]],

       [[   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,  160.,  160.,    1.],
        [   1.,    1.,  160.,  160.,    1.],
        [   1.,    1.,    1.,    1.,    1.]],

       [[   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,  170.,  170.,    1.],
        [   1.,    1.,  170.,  170.,    1.],
        [   1.,    1.,    1.,    1.,    1.]]])
In [53]: I = a==np.array([150,160,170])[:,None,None]

In [54]: I
Out[54]: 
array([[[False, False, False, False, False],
        [False, False, False, False, False],
        [False, False,  True,  True, False],
        [False, False,  True,  True, False],
        [False, False, False, False, False]],

       [[False, False, False, False, False],
        [False, False, False, False, False],
        [False, False,  True,  True, False],
        [False, False,  True,  True, False],
        [False, False, False, False, False]],

       [[False, False, False, False, False],
        [False, False, False, False, False],
        [False, False,  True,  True, False],
        [False, False,  True,  True, False],
        [False, False, False, False, False]]], dtype=bool)
In [90]: K=J[None,...].repeat(3,0)
In [91]: K
Out[91]: 
array([[[False, False, False, False, False],
        [False, False, False, False, False],
        [False, False,  True,  True, False],
        [False, False,  True,  True, False],
        [False, False, False, False, False]],

       [[False, False, False, False, False],
        ....]], dtype=bool)
第一维度上的值为
[150160170]
的所有位置的布尔值。关键是将其扩展到一个3d形状
(3,1,1)
,可以广播到
(3,5,5)
,并与
a
进行比较:

In [48]: a=np.ones((3,5,5))    
In [49]: a[0,2:4,2:4]=150
In [50]: a[1,2:4,2:4]=160
In [51]: a[2,2:4,2:4]=170

In [52]: a
Out[52]: 
array([[[   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,  150.,  150.,    1.],
        [   1.,    1.,  150.,  150.,    1.],
        [   1.,    1.,    1.,    1.,    1.]],

       [[   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,  160.,  160.,    1.],
        [   1.,    1.,  160.,  160.,    1.],
        [   1.,    1.,    1.,    1.,    1.]],

       [[   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,  170.,  170.,    1.],
        [   1.,    1.,  170.,  170.,    1.],
        [   1.,    1.,    1.,    1.,    1.]]])
In [53]: I = a==np.array([150,160,170])[:,None,None]

In [54]: I
Out[54]: 
array([[[False, False, False, False, False],
        [False, False, False, False, False],
        [False, False,  True,  True, False],
        [False, False,  True,  True, False],
        [False, False, False, False, False]],

       [[False, False, False, False, False],
        [False, False, False, False, False],
        [False, False,  True,  True, False],
        [False, False,  True,  True, False],
        [False, False, False, False, False]],

       [[False, False, False, False, False],
        [False, False, False, False, False],
        [False, False,  True,  True, False],
        [False, False,  True,  True, False],
        [False, False, False, False, False]]], dtype=bool)
In [90]: K=J[None,...].repeat(3,0)
In [91]: K
Out[91]: 
array([[[False, False, False, False, False],
        [False, False, False, False, False],
        [False, False,  True,  True, False],
        [False, False,  True,  True, False],
        [False, False, False, False, False]],

       [[False, False, False, False, False],
        ....]], dtype=bool)
现在,将所有值为
True
的插槽更改为
0
,就很简单了:

In [55]: a[I]=0

In [56]: a
Out[56]: 
array([[[ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  0.,  0.,  1.],
        [ 1.,  1.,  0.,  0.,  1.],
        [ 1.,  1.,  1.,  1.,  1.]],

       [[ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  0.,  0.,  1.],
        [ 1.,  1.,  0.,  0.,  1.],
        [ 1.,  1.,  1.,  1.,  1.]],

       [[ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  0.,  0.,  1.],
        [ 1.,  1.,  0.,  0.,  1.],
        [ 1.,  1.,  1.,  1.,  1.]]])
查看删除答案上的注释,我发现您确实希望所有3个值都匹配。也就是说,与您的示例相反,您可能不想更改其他插槽
a[0,…]
is 150等

您仍然可以使用此
I
,只需在第一轴上取一个
all

In [58]: a[:,I.all(axis=0)]=2

In [59]: a
Out[59]: 
array([[[ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  2.,  2.,  1.],
        [ 1.,  1.,  2.,  2.,  1.],
        [ 1.,  1.,  1.,  1.,  1.]],

       [[ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  2.,  2.,  1.],
        [ 1.,  1.,  2.,  2.,  1.],
        [ 1.,  1.,  1.,  1.,  1.]],

       [[ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  2.,  2.,  1.],
        [ 1.,  1.,  2.,  2.,  1.],
        [ 1.,  1.,  1.,  1.,  1.]]])
从概念上讲,我的答案与公认的答案没有太大区别。这会将阵列重塑为2d,因此可以使用1d进行匹配
[150160170]
。事实上,它被自动重新调整为
(1,3)
,可以在
(25,3)
数组中再次广播。转置和重塑是标准化此类问题格式的一种方便方法,尽管它通常不是必需的


这可能有助于将最后一个操作拆分为:

In [60]: J=I.all(axis=0)

In [61]: J
Out[61]: 
array([[False, False, False, False, False],
       [False, False, False, False, False],
       [False, False,  True,  True, False],
       [False, False,  True,  True, False],
       [False, False, False, False, False]], dtype=bool)

In [62]: a[:, J] = 3
或者使用
np。其中
将布尔数组转换为2个索引列表:

In [73]: jj=np.where(J)
In [74]: jj
Out[74]: (array([2, 2, 3, 3], dtype=int32), array([2, 3, 2, 3], dtype=int32))

In [75]: a[:, jj[0], jj[1]] = 4
a[:,jj]
不起作用,但
a[(片(无),)+jj]
起作用。最后一个表达式构造了一个3元素元组,相当于[75]

我还可以将
J
扩展到与
a
匹配的大小和形状:

In [48]: a=np.ones((3,5,5))    
In [49]: a[0,2:4,2:4]=150
In [50]: a[1,2:4,2:4]=160
In [51]: a[2,2:4,2:4]=170

In [52]: a
Out[52]: 
array([[[   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,  150.,  150.,    1.],
        [   1.,    1.,  150.,  150.,    1.],
        [   1.,    1.,    1.,    1.,    1.]],

       [[   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,  160.,  160.,    1.],
        [   1.,    1.,  160.,  160.,    1.],
        [   1.,    1.,    1.,    1.,    1.]],

       [[   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,  170.,  170.,    1.],
        [   1.,    1.,  170.,  170.,    1.],
        [   1.,    1.,    1.,    1.,    1.]]])
In [53]: I = a==np.array([150,160,170])[:,None,None]

In [54]: I
Out[54]: 
array([[[False, False, False, False, False],
        [False, False, False, False, False],
        [False, False,  True,  True, False],
        [False, False,  True,  True, False],
        [False, False, False, False, False]],

       [[False, False, False, False, False],
        [False, False, False, False, False],
        [False, False,  True,  True, False],
        [False, False,  True,  True, False],
        [False, False, False, False, False]],

       [[False, False, False, False, False],
        [False, False, False, False, False],
        [False, False,  True,  True, False],
        [False, False,  True,  True, False],
        [False, False, False, False, False]]], dtype=bool)
In [90]: K=J[None,...].repeat(3,0)
In [91]: K
Out[91]: 
array([[[False, False, False, False, False],
        [False, False, False, False, False],
        [False, False,  True,  True, False],
        [False, False,  True,  True, False],
        [False, False, False, False, False]],

       [[False, False, False, False, False],
        ....]], dtype=bool)

并使用
a[K]
构建您的
a

In [48]: a=np.ones((3,5,5))    
In [49]: a[0,2:4,2:4]=150
In [50]: a[1,2:4,2:4]=160
In [51]: a[2,2:4,2:4]=170

In [52]: a
Out[52]: 
array([[[   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,  150.,  150.,    1.],
        [   1.,    1.,  150.,  150.,    1.],
        [   1.,    1.,    1.,    1.,    1.]],

       [[   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,  160.,  160.,    1.],
        [   1.,    1.,  160.,  160.,    1.],
        [   1.,    1.,    1.,    1.,    1.]],

       [[   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,  170.,  170.,    1.],
        [   1.,    1.,  170.,  170.,    1.],
        [   1.,    1.,    1.,    1.,    1.]]])
In [53]: I = a==np.array([150,160,170])[:,None,None]

In [54]: I
Out[54]: 
array([[[False, False, False, False, False],
        [False, False, False, False, False],
        [False, False,  True,  True, False],
        [False, False,  True,  True, False],
        [False, False, False, False, False]],

       [[False, False, False, False, False],
        [False, False, False, False, False],
        [False, False,  True,  True, False],
        [False, False,  True,  True, False],
        [False, False, False, False, False]],

       [[False, False, False, False, False],
        [False, False, False, False, False],
        [False, False,  True,  True, False],
        [False, False,  True,  True, False],
        [False, False, False, False, False]]], dtype=bool)
In [90]: K=J[None,...].repeat(3,0)
In [91]: K
Out[91]: 
array([[[False, False, False, False, False],
        [False, False, False, False, False],
        [False, False,  True,  True, False],
        [False, False,  True,  True, False],
        [False, False, False, False, False]],

       [[False, False, False, False, False],
        ....]], dtype=bool)
第一维度上的值为
[150160170]
的所有位置的布尔值。关键是将其扩展到一个3d形状
(3,1,1)
,可以广播到
(3,5,5)
,并与
a
进行比较:

In [48]: a=np.ones((3,5,5))    
In [49]: a[0,2:4,2:4]=150
In [50]: a[1,2:4,2:4]=160
In [51]: a[2,2:4,2:4]=170

In [52]: a
Out[52]: 
array([[[   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,  150.,  150.,    1.],
        [   1.,    1.,  150.,  150.,    1.],
        [   1.,    1.,    1.,    1.,    1.]],

       [[   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,  160.,  160.,    1.],
        [   1.,    1.,  160.,  160.,    1.],
        [   1.,    1.,    1.,    1.,    1.]],

       [[   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,  170.,  170.,    1.],
        [   1.,    1.,  170.,  170.,    1.],
        [   1.,    1.,    1.,    1.,    1.]]])
In [53]: I = a==np.array([150,160,170])[:,None,None]

In [54]: I
Out[54]: 
array([[[False, False, False, False, False],
        [False, False, False, False, False],
        [False, False,  True,  True, False],
        [False, False,  True,  True, False],
        [False, False, False, False, False]],

       [[False, False, False, False, False],
        [False, False, False, False, False],
        [False, False,  True,  True, False],
        [False, False,  True,  True, False],
        [False, False, False, False, False]],

       [[False, False, False, False, False],
        [False, False, False, False, False],
        [False, False,  True,  True, False],
        [False, False,  True,  True, False],
        [False, False, False, False, False]]], dtype=bool)
In [90]: K=J[None,...].repeat(3,0)
In [91]: K
Out[91]: 
array([[[False, False, False, False, False],
        [False, False, False, False, False],
        [False, False,  True,  True, False],
        [False, False,  True,  True, False],
        [False, False, False, False, False]],

       [[False, False, False, False, False],
        ....]], dtype=bool)
现在,将所有值为
True
的插槽更改为
0
,就很简单了:

In [55]: a[I]=0

In [56]: a
Out[56]: 
array([[[ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  0.,  0.,  1.],
        [ 1.,  1.,  0.,  0.,  1.],
        [ 1.,  1.,  1.,  1.,  1.]],

       [[ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  0.,  0.,  1.],
        [ 1.,  1.,  0.,  0.,  1.],
        [ 1.,  1.,  1.,  1.,  1.]],

       [[ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  0.,  0.,  1.],
        [ 1.,  1.,  0.,  0.,  1.],
        [ 1.,  1.,  1.,  1.,  1.]]])
查看删除答案上的注释,我发现您确实希望所有3个值都匹配。也就是说,与您的示例相反,您可能不想更改其他插槽
a[0,…]
is 150等

您仍然可以使用此
I
,只需在第一轴上取一个
all

In [58]: a[:,I.all(axis=0)]=2

In [59]: a
Out[59]: 
array([[[ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  2.,  2.,  1.],
        [ 1.,  1.,  2.,  2.,  1.],
        [ 1.,  1.,  1.,  1.,  1.]],

       [[ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  2.,  2.,  1.],
        [ 1.,  1.,  2.,  2.,  1.],
        [ 1.,  1.,  1.,  1.,  1.]],

       [[ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  2.,  2.,  1.],
        [ 1.,  1.,  2.,  2.,  1.],
        [ 1.,  1.,  1.,  1.,  1.]]])
从概念上讲,我的答案与公认的答案没有太大区别。这会将阵列重塑为2d,因此可以使用1d进行匹配
[150160170]
。事实上,它被自动重新调整为
(1,3)
,可以在
(25,3)
数组中再次广播。转置和重塑是标准化此类问题格式的一种方便方法,尽管它通常不是必需的


这可能有助于将最后一个操作拆分为:

In [60]: J=I.all(axis=0)

In [61]: J
Out[61]: 
array([[False, False, False, False, False],
       [False, False, False, False, False],
       [False, False,  True,  True, False],
       [False, False,  True,  True, False],
       [False, False, False, False, False]], dtype=bool)

In [62]: a[:, J] = 3
或者使用
np。其中
将布尔数组转换为2个索引列表:

In [73]: jj=np.where(J)
In [74]: jj
Out[74]: (array([2, 2, 3, 3], dtype=int32), array([2, 3, 2, 3], dtype=int32))

In [75]: a[:, jj[0], jj[1]] = 4
a[:,jj]
不起作用,但
a[(片(无),)+jj]
起作用。最后一个表达式构造了一个3元素元组,相当于[75]

我还可以将
J
扩展到与
a
匹配的大小和形状:

In [48]: a=np.ones((3,5,5))    
In [49]: a[0,2:4,2:4]=150
In [50]: a[1,2:4,2:4]=160
In [51]: a[2,2:4,2:4]=170

In [52]: a
Out[52]: 
array([[[   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,  150.,  150.,    1.],
        [   1.,    1.,  150.,  150.,    1.],
        [   1.,    1.,    1.,    1.,    1.]],

       [[   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,  160.,  160.,    1.],
        [   1.,    1.,  160.,  160.,    1.],
        [   1.,    1.,    1.,    1.,    1.]],

       [[   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,    1.,    1.,    1.],
        [   1.,    1.,  170.,  170.,    1.],
        [   1.,    1.,  170.,  170.,    1.],
        [   1.,    1.,    1.,    1.,    1.]]])
In [53]: I = a==np.array([150,160,170])[:,None,None]

In [54]: I
Out[54]: 
array([[[False, False, False, False, False],
        [False, False, False, False, False],
        [False, False,  True,  True, False],
        [False, False,  True,  True, False],
        [False, False, False, False, False]],

       [[False, False, False, False, False],
        [False, False, False, False, False],
        [False, False,  True,  True, False],
        [False, False,  True,  True, False],
        [False, False, False, False, False]],

       [[False, False, False, False, False],
        [False, False, False, False, False],
        [False, False,  True,  True, False],
        [False, False,  True,  True, False],
        [False, False, False, False, False]]], dtype=bool)
In [90]: K=J[None,...].repeat(3,0)
In [91]: K
Out[91]: 
array([[[False, False, False, False, False],
        [False, False, False, False, False],
        [False, False,  True,  True, False],
        [False, False,  True,  True, False],
        [False, False, False, False, False]],

       [[False, False, False, False, False],
        ....]], dtype=bool)

并使用
a[K]

np。其中(条件)问题和示例应该更清楚地表明
[150160170]
必须同时出现。@hpaulj是的!他们应该在一起!!np.where(condition)问题和示例应该更清楚地表明
[150160170]
必须同时出现。@hpaulj是的!他们应该在一起!!下面的
a[:,I.all(axis=0)]=2
部分有点难。难道不能使用
I=a==np.array([150160170])[:,None,None]
并定义一些类似于(1,3)的轴来预先获得索引吗?我已经详细阐述了
I.all
索引。下面的
a[:,I.all(axis=0)]=2部分有点困难。难道不能使用
I=a==np.array([150160170])[:,None,None]
并定义一些类似于(1,3)的轴来预先获得索引吗?我已经详细阐述了
I.all
索引。