如何将二维数组转换为一维数组?

时间:2019-01-04 19:01:55

标签: python arrays numpy

我有二维numpy数组arr

array([[0., 1., 0.],
       [1., 0., 0.],
       [1., 0., 0.],
       [0., 0., 1.],
       [1., 0., 0.],
       [1., 0., 0.]]

我想将其转换为一维矢量:

vec = [1, 0, 0, 2, 0, 0]

值0、1和2应对应于art的一列,其中值等于1。

是否有任何非for循环方法?

3 个答案:

答案 0 :(得分:1)

尝试numpy.nonzero

>>> import numpy as np
>>> a = np.array([[0., 1., 0.],
...               [1., 0., 0.],
...               [1., 0., 0.],
...               [0., 0., 1.],
...               [1., 0., 0.],
...               [1., 0., 0.]])
>>> np.nonzero(a)[1]
array([1, 0, 0, 2, 0, 0])

numpy.where

>>> np.where(a)[1]
array([1, 0, 0, 2, 0, 0])

答案 1 :(得分:0)

您可以使用矩阵数学来解决此问题,因为每行只有一个非零值。一个带有“位置”矢量的简单点积将为您提供所需的输出。您想模拟矩阵方程A * x = y,只要x是列向量,您将最终以列向量作为答案。

>>> import numpy as np
>>> a = np.array([[0., 1., 0.],
...               [1., 0., 0.],
...               [1., 0., 0.],
...               [0., 0., 1.],
...               [1., 0., 0.],
...               [1., 0., 0.]])
>>> x = (0,1,2)
>>> y = np.dot(a,x)
>>> y
array([1., 0., 0., 2., 0., 0.])

使用此方法,您可以将“位置”向量更改为所需的值,并且它将适当地“索引”(由于使用了数学技巧,所以将其用引号引起来)。例如:

>>> x = (2,4,8)
>>> np.dot(a,x)
array([4., 2., 2., 8., 2., 2.])

答案 2 :(得分:0)

>>> a.nonzero()[1]
array([1, 0, 0, 2, 0, 0], dtype=int64)

为了获得更灵活的条件

>>> np.nonzero(a==1)[1]
array([1, 0, 0, 2, 0, 0], dtype=int64)

>>> np.where(a==1)[1]
array([1, 0, 0, 2, 0, 0], dtype=int64)

>>> np.where(a>0)[1]
array([1, 0, 0, 2, 0, 0], dtype=int64)