我有一个有4列的numpy数组,想要选择第1,3和4列,其中第二列的值满足某个条件(即固定值)。我试图首先只选择行,但通过以下所有4列选择:
I = A[A[:,1] == i]
哪个有效。然后我进一步尝试(类似于我非常清楚的matlab):
I = A[A[:,1] == i, [0,2,3]]
哪个不起作用。怎么做?
示例数据:
>>> A = np.array([[1,2,3,4],[6,1,3,4],[3,2,5,6]])
>>> print A
[[1 2 3 4]
[6 1 3 4]
[3 2 5 6]]
>>> i = 2
# I want to get the columns 1, 3 and 4 for every row which has the value i in the second column. In this case, this would be row 1 and 3 with columns 1, 3 and 4:
[[1 3 4]
[3 5 6]]
我现在正在使用它:
I = A[A[:,1] == i]
I = I[:, [0,2,3]]
但我认为必须有一个更好的方法...(我习惯于MATLAB)
答案 0 :(得分:15)
>>> a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
>>> a
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
>>> a[a[:,0] > 3] # select rows where first column is greater than 3
array([[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
>>> a[a[:,0] > 3][:,np.array([True, True, False, True])] # select columns
array([[ 5, 6, 8],
[ 9, 10, 12]])
# fancier equivalent of the previous
>>> a[np.ix_(a[:,0] > 3, np.array([True, True, False, True]))]
array([[ 5, 6, 8],
[ 9, 10, 12]])
有关模糊np.ix_()
的说明,请参阅https://stackoverflow.com/a/13599843/4323
最后,我们可以通过给出列号列表而不是繁琐的布尔掩码来简化:
>>> a[np.ix_(a[:,0] > 3, (0,1,3))]
array([[ 5, 6, 8],
[ 9, 10, 12]])
答案 1 :(得分:4)
如果您不想使用布尔位置而是使用索引,则可以这样写:
A[:, [0, 2, 3]][A[:, 1] == i]
回到你的例子:
>>> A = np.array([[1,2,3,4],[6,1,3,4],[3,2,5,6]])
>>> print A
[[1 2 3 4]
[6 1 3 4]
[3 2 5 6]]
>>> i = 2
>>> print A[:, [0, 2, 3]][A[:, 1] == i]
[[1 3 4]
[3 5 6]]
严重的是,
答案 2 :(得分:3)
>>> a=np.array([[1,2,3], [1,3,4], [2,2,5]])
>>> a[a[:,0]==1][:,[0,1]]
array([[1, 2],
[1, 3]])
>>>
答案 3 :(得分:1)
这也有效。
I = np.array([row[[x for x in range(A.shape[1]) if x != i-1]] for row in A if row[i-1] == i])
print I
编辑:由于索引从0开始,所以
i-1
应该使用。
答案 4 :(得分:1)
我希望这能回答你的问题,但我用pandas实现的一段脚本是:
df_targetrows = df.loc[df[col2filter]*somecondition*, [col1,col2,...,coln]]
例如,
targets = stockdf.loc[stockdf['rtns'] > .04, ['symbol','date','rtns']]
这将返回仅包含['symbol','date','rtns']
列stockdf
的数据框,其中rtns
的行值满足stockdf['rtns'] > .04
希望这会有所帮助