我对python和numpy很新.有人可以帮我理解如何对一些用作索引的数组进行索引.我有以下六个这样的2D阵列 -
array([[2, 0],
[3, 0],
[3, 1],
[5, 0],
[5, 1],
[5, 2]])
Run Code Online (Sandbox Code Playgroud)
我想使用这些数组作为索引,并将值10放在新空矩阵的相应索引中.输出应如下所示 -
array([[ 0, 0, 0],
[ 0, 0, 0],
[10, 0, 0],
[10, 10, 0],
[ 0, 0, 0],
[10, 10, 10]])
Run Code Online (Sandbox Code Playgroud)
到目前为止,我试过这个 -
from numpy import*
a = array([[2,0],[3,0],[3,1],[5,0],[5,1],[5,2]])
b = zeros((6,3),dtype ='int32')
b[a] = 10
Run Code Online (Sandbox Code Playgroud)
但这给了我错误的输出.任何帮助请.
unu*_*tbu 49
In [1]: import numpy as np
In [2]: a = np.array([[2,0],[3,0],[3,1],[5,0],[5,1],[5,2]])
In [3]: b = np.zeros((6,3), dtype='int32')
In [4]: b[a[:,0], a[:,1]] = 10
In [5]: b
Out[5]:
array([[ 0, 0, 0],
[ 0, 0, 0],
[10, 0, 0],
[10, 10, 0],
[ 0, 0, 0],
[10, 10, 10]])
Run Code Online (Sandbox Code Playgroud)
为什么会这样:
如果在赋值中b
使用两个 numpy数组进行索引,
b[x, y] = z
Run Code Online (Sandbox Code Playgroud)
然后把NumPy想象成同时移动每个元素x
和每个元素的y
每一个元素z
(让我们调用它们xval
,yval
和zval
),然后将值赋给b [xval,yval] zval
.当z
为常数时," z
每次移动仅返回相同的值.
这就是我们想要的,x
作为第一列a
和y
第二列a
.因此,选择x = a[:, 0]
,和y = a[:, 1]
.
b[a[:,0], a[:,1]] = 10
Run Code Online (Sandbox Code Playgroud)
为什么b[a] = 10
不起作用
当你写b[a]
,认为NumPy的,如创建由每个元素在移动一个新的数组a
,(我们称之为每一个idx
)和新的阵列中放置的价值b[idx]
在的位置idx
中a
.
idx
是一个价值a
.所以这是一个int32. b
具有形状(6,3),b[idx]
也是一排b
形状(3,).例如,当idx
是
In [37]: a[1,1]
Out[37]: 0
Run Code Online (Sandbox Code Playgroud)
b[a[1,1]]
是
In [38]: b[a[1,1]]
Out[38]: array([0, 0, 0])
Run Code Online (Sandbox Code Playgroud)
所以
In [33]: b[a].shape
Out[33]: (6, 2, 3)
Run Code Online (Sandbox Code Playgroud)
因此,让我们再说一遍:NumPy的是通过移动过的每个要素创建一个新的数组a
和新数组中放置的价值b[idx]
在的位置idx
中a
.作为idx
移动越过a
,形状(6,2)的阵列将被创建.但由于b[idx]
它本身是形状(3,),在(6,2)形阵列中的每个位置,都放置了一个(3,)形状的值.结果是一个形状数组(6,2,3).
现在,当你做一个像
b[a] = 10
Run Code Online (Sandbox Code Playgroud)
b[a]
创建具有值的临时形状数组(6,2,3),然后执行赋值.由于10是常量,因此该赋值将值10放在(6,2,3)形数组中的每个位置.然后将临时数组中的值重新分配回b
.请参阅文档参考.因此,(6,2,3)形数组中的值被复制回(6,3)形b
数组.值互相覆盖.但重点是你没有获得你想要的任务.
归档时间: |
|
查看次数: |
68651 次 |
最近记录: |