Python Numpy:索引和值的向量
我想我这一天过得很慢,搞不懂这一天。我有一个m x n numpy数组,希望将其转换为一个向量,其中每个元素都是一个三维向量,包含数组中所有元素的行号、列号和值Python Numpy:索引和值的向量,python,numpy,Python,Numpy,我想我这一天过得很慢,搞不懂这一天。我有一个m x n numpy数组,希望将其转换为一个向量,其中每个元素都是一个三维向量,包含数组中所有元素的行号、列号和值 例如,给定一个numpy数组,a,向量中的第一个元素是:[1,1,a[1,1]],然后下一个元素是[1,2,a[1,2]]等等。我认为这样应该可以: n = 10 m = 5 data = np.random.randn(n, m) grid = np.indices(data.shape) r = np.array([grid[0]
例如,给定一个numpy数组,a,向量中的第一个元素是:[1,1,a[1,1]],然后下一个元素是[1,2,a[1,2]]等等。我认为这样应该可以:
n = 10
m = 5
data = np.random.randn(n, m)
grid = np.indices(data.shape)
r = np.array([grid[0], grid[1], data])
result = np.array(zip(*r.T))
不过,可能有更有效的方法来做到这一点。请参阅:此序列生成一个(3,n*m)数组,其中包含索引和值
In [786]: A = np.arange(12).reshape(3,4)
In [787]: X=np.vstack([np.indices(A.shape),A[None,...]]).reshape(3,-1)
In [788]: X.shape
Out[788]: (3, 12)
In [789]: X
Out[789]:
array([[ 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2],
[ 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3],
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]])
可以将其转置,使每个“行”表示一个元素:
In [793]: X.T[0,:]
Out[793]: array([0, 0, 0])
In [794]: X.T[10,:]
Out[794]: array([ 2, 2, 10])
它也可以被转换成一个长度(n*m,)
和dtype('i4,i4,i4')
的结构化数组。这个例子有点混乱,但它确实起到了作用:
In [796]: dt=np.dtype('i4,i4,i4')
In [806]: X1=np.zeros(X.shape[1],dtype=dt)
In [809]: X1['f0']=X[0]
In [810]: X1['f1']=X[1]
In [811]: X1['f2']=X[2]
# or more compactly: for i,n in enumerate(X1.dtype.names): X1[n] = X[i,:]
In [812]: X1
Out[812]:
array([(0, 0, 0), (0, 1, 1), (0, 2, 2), (0, 3, 3), (1, 0, 4), (1, 1, 5),
(1, 2, 6), (1, 3, 7), (2, 0, 8), (2, 1, 9), (2, 2, 10), (2, 3, 11)],
dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4')])
In [813]: X1[10]
Out[813]: (2, 2, 10) # note, this a tuple
In [814]: X1['f2']
Out[814]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
X1[10]
是一个0D
数组,带有dtypedt
,形状()
,打印为元组。您想使用mxn
数组还是nx2
数组?@Bakuriu我希望它可以扩展到所有大小。在Python和numpython中,索引从0
开始。所以第一个元素应该是[0,0,a[0,0]]
。我需要它是一个三元组的向量,结果仍然是一个mxn数组。我想我只是重塑结果?是的,我想你想要result=r.T.restrape(-1,3)
你想要一个二维数组,还是一个带有元组(dtype)元素的一维数组?
In [833]: A = np.arange(12,dtype=float).reshape(3,4)
In [834]: X = np.indices(A.shape).reshape(2,-1)
...
In [848]: dt=np.dtype([('row',int), ('col',int), ('value',float)])
In [850]: X1 = np.zeros(X.shape[1], dtype=dt)
In [851]: X1['row']=X[0,:]
In [852]: X1['col']=X[1,:]
In [853]: X1['value']=A.flatten()
In [854]: X1
Out[854]:
array([(0, 0, 0.0), (0, 1, 1.0), (0, 2, 2.0), (0, 3, 3.0), (1, 0, 4.0),
(1, 1, 5.0), (1, 2, 6.0), (1, 3, 7.0), (2, 0, 8.0), (2, 1, 9.0),
(2, 2, 10.0), (2, 3, 11.0)],
dtype=[('row', '<i4'), ('col', '<i4'), ('value', '<f8')])
In [855]: X1[10]
Out[855]: (2, 2, 10.0)