问题描述
所以,假设我在python中有这个2D数组
a = [[1,2]
[2,3]
[3,2]
[1,3]]
如何获得具有相同行值的所有数组条目并将它们存储在新矩阵中。 例如,我将有
b = [1,2]
[1,3]
查询后。
我的方法是b = [a[i] for i in a if a[i][0] == 1][0]]
但似乎没有用?
我是Python的新手,整个索引切片的事情有点令人困惑。 谢谢!
1楼
由于标记了numpy ,因此可以使用NumPy数组执行此任务。 首先定义您的数组:
a = np.array([[1, 2],
[2, 3],
[3, 2],
[1, 3]])
对于第一列中的所有唯一值,您可以使用字典理解。 这对于避免重复操作很有用。
d = {i: a[a[:, 0] == i] for i in np.unique(a[:, 0])}
{1: array([[1, 2],
[1, 3]]),
2: array([[2, 3]]),
3: array([[3, 2]])}
然后通过d[1]
访问第一列等于1的数组。
对于单个查询,您可以简单地使用a[a[:, 0] == 1]
。
2楼
语法中的for i in a
会为您提供列表中的实际项目。.so例如:
list_of_strs = ['first', 'second', 'third']
first_letters = [s[0] for s in list_of_strs]
# first_letters == ['f', 's', 't']
b = [a[i] for i in a if a[i][0]==1]
试图用a的每个元素索引a的元素,则您实际上对b = [a[i] for i in a if a[i][0]==1]
的操作。
但是,由于每个元素a
是本身的列表,这是不行的(你不能与其他列表索引列表)
这样的事情应该起作用:
b = [row for row in a if row[0] == 1]
如果您将其编写为函数,则可以得到加分,以便您可以选择要过滤的内容。
如果您经常使用数组,则还可以签出 。 使用numpy,您可以执行以下操作。
import numpy as np
a = np.array([[1,2], [2,3], [3,2], [1,3]])
b = a[a[:,0] == 1]
最后一行基本上a
使用在第一组方括号内定义的布尔数组来索引原始数组a
。
它非常灵活,因此您也可以修改它以在第二个元素上进行过滤,在其他条件下进行过滤(例如> some_number
),等等。