Numpy:指数和价值的向量

时间:2014-10-07 17:03:03

标签: python numpy

我想我有一个缓慢的一天,并不能解决这个问题。我有一个m x n numpy数组,想要将它转换为一个向量,其中每个元素都是一个3维向量,包含数组中所有元素的行号,列号和值。

例如,给定一个numpy数组,a,向量中的第一个元素是:[1,1,a [1,1]]然后下一个将是[1,2,a [1,2]等等。

2 个答案:

答案 0 :(得分:1)

我认为这样的事情应该有效:

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

虽然可能有更有效的方法来做到这一点。请参阅:numpy.indices

答案 1 :(得分:1)

该序列产生具有索引和值

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

假设原始矩阵是浮点数,我们希望在新数组中保留该类型。我们可以跳过vstack步骤

来做到这一点
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)

X1[10]是一个0D数组,其中dtype为dt,形状为(),其打印为元组。