Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.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
Python Numpy:索引和值的向量_Python_Numpy - Fatal编程技术网

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

我想我这一天过得很慢,搞不懂这一天。我有一个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], 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
数组,带有dtype
dt
,形状
()
,打印为元组。

您想使用
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)