Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.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,我有一个4列的numpy数组,希望选择第1、3和4列,其中第二列的值满足某个条件(即固定值)。我尝试首先仅选择行,但通过以下方式选择所有4列: I = A[A[:,1] == i] 这很有效。然后我进一步尝试(类似于我非常熟悉的matlab): 这不管用。怎么做 示例数据: >>> 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

我有一个4列的numpy数组,希望选择第1、3和4列,其中第二列的值满足某个条件(即固定值)。我尝试首先仅选择行,但通过以下方式选择所有4列:

I = A[A[:,1] == i]
这很有效。然后我进一步尝试(类似于我非常熟悉的matlab):

这不管用。怎么做


示例数据:

 >>> 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)

有关晦涩难懂的
np.ix(
)的解释,请参阅

最后,我们可以通过提供列编号列表而不是繁琐的布尔掩码来简化:

>>> a[np.ix_(a[:,0] > 3, (0,1,3))]
array([[ 5,  6,  8],
       [ 9, 10, 12]])
这也行得通

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

应使用。

如果不希望使用布尔位置,但希望使用索引,则可以这样编写:

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

说真的,

我希望这能回答您的问题,但我使用pandas实现的一个脚本是:

df_targetrows = df.loc[df[col2filter]*somecondition*, [col1,col2,...,coln]]
比如说,

targets = stockdf.loc[stockdf['rtns'] > .04, ['symbol','date','rtns']]
这将从
stockdf
返回一个数据帧,其中
rtns
的行值满足,
stockdf['rtns']>.04


希望这有帮助

A[A[:,1]==i][0,2,3]
也不起作用吗?i=A[A[:,1]==i][0,2,3]-->索引器:索引太多了,除此之外,我不得不承认,我也不会真正理解索引,与matlab非常不同…@tim:你能发布数组吗?你希望得到什么输出?@Ankur Ankan:编辑到问题中。所以真的需要两个连续的选择吗?如果你希望你能做
a[x][y]
其中x和y是布尔掩码,是的,我也希望这样,但它不起作用。这似乎是一个已知的问题,我不知道为什么,但这在这里并不重要。不仅如此,我希望能够在一条语句中选择行和列,如下所示:
a[row\u index\u to\u select,colu index\u to\u select]
,而
row\u index\u to\u select
将来自我想要应用的条件(我添加了更多的解决方案——我喜欢最后一个使用ix_()的解决方案)使用元组。算法必须是正确的,但它不是很python。@Taha可能不是,但它节省了您的双重选择。这个想法其实很简单,先选择cols,然后在行上迭代。@我理解您所做的。但最近,我在用大矩阵进行数值计算。我一直需要矢量化计算。pr你建议的问题是你要创建一个新的列表。你不能用这种方式直接改变矩阵中的值。如果你不需要改变a的值,这确实很有用。布尔位置实际上对我来说没问题,我只想一步完成选择,而不是两个连续的选择(您的解决方案正在做什么,不是吗?)因为性能原因。
>>> a=np.array([[1,2,3], [1,3,4], [2,2,5]])
>>> a[a[:,0]==1][:,[0,1]]
array([[1, 2],
       [1, 3]])
>>> 
targets = stockdf.loc[stockdf['rtns'] > .04, ['symbol','date','rtns']]
>>> a=np.array([[1,2,3], [1,3,4], [2,2,5]])
>>> a[a[:,0]==1][:,[0,1]]
array([[1, 2],
       [1, 3]])
>>>