【发布时间】:2014-02-13 14:56:56
【问题描述】:
我有一个矩阵 A,它有 3 列,看起来有点像,但要大得多:
[[10 15 1.0]
[21 13 1.0]
[9 14 0.0]
[14 24 1.0]
[21 31 0.0]
...]
我想创建两个单独的矩阵:一个包含第三列=0.0 的所有数据,另一个包含第三列=1.0 的所有数据。所以本质上是按第三列中的值 0.0 或 1.0 拆分数据。
【问题讨论】:
我有一个矩阵 A,它有 3 列,看起来有点像,但要大得多:
[[10 15 1.0]
[21 13 1.0]
[9 14 0.0]
[14 24 1.0]
[21 31 0.0]
...]
我想创建两个单独的矩阵:一个包含第三列=0.0 的所有数据,另一个包含第三列=1.0 的所有数据。所以本质上是按第三列中的值 0.0 或 1.0 拆分数据。
【问题讨论】:
如果您使用Numpy,请先找到第三列具有所需值的行,然后使用indexing 提取行。
演示
>>> import numpy
>>> A = numpy.array([[1, 0, 1],
[2, 0, 1],
[3, 0, 0],
[4, 0, 0],
[5, 0, 0]])
>>> A1 = A[A[:, 2] == 1, :] # extract all rows with the third column 1
>>> A0 = A[A[:, 2] == 0, :] # extract all rows with the third column 0
>>> A0
array([[3, 0, 0],
[4, 0, 0],
[5, 0, 0]])
>>> A1
array([[1, 0, 1],
[2, 0, 1]])
【讨论】:
>>> a
array([[ 10., 15., 1.],
[ 21., 13., 1.],
[ 9., 14., 0.],
[ 14., 24., 1.],
[ 21., 31., 0.]])
>>> a[np.where(a[:,-1])]
array([[ 10., 15., 1.],
[ 21., 13., 1.],
[ 14., 24., 1.]])
>>> a[np.where(~a[:,-1].astype(bool))]
array([[ 9., 14., 0.],
[ 21., 31., 0.]])
【讨论】:
以下是我们如何使用列表推导来分离矩阵,无需导入额外的库。首先,一个包含第三列所有数据的矩阵是0.0:
[x for x in matrix if x[2] == 0.0]
还有另一个矩阵,其中包含与第三列为 1.0 时相关的所有数据:
[x for x in matrix if x[2] == 1.0]
例如:
matrix = [[10, 15, 1.0],
[21, 13, 1.0],
[ 9, 14, 0.0],
[14, 24, 1.0],
[21, 31, 0.0]]
[x for x in matrix if x[2] == 0.0]
=> [[ 9, 14, 0.0],
[21, 31, 0.0]]
[x for x in matrix if x[2] == 1.0]
=> [[10, 15, 1.0],
[21, 13, 1.0],
[14, 24, 1.0]]
【讨论】: