从索引中提取值而不使用循环

时间:2015-05-12 00:20:09

标签: python numpy matrix vectorization

所以我有一个包含数据的矩阵和一个包含我应该从矩阵中提取哪些数据的信息的向量。真正的矩阵要长得多,但下面是一个简短的版本,只是为了说明我的意思。

Data matrix = array([[1 2 3],[0 3 5],[1 4 4]]) 
Info vector = array([[1], [0], [2]])
Answer matrix = array([[2 (the second element)], [0(the first element)], 4(the third element)]])

简单的循环:

length_data = data.shapes[0]
for i in xrange(length_data)
    answer[i] = data[info[i],i]

我知道如何通过简单的for循环来实现这一点,但是如何使用矢量化来实现这一点,而不使用任何循环?

谢谢!

对问题的轻微补充:如果我希望答案如下,该怎么办

Answer matrix = array([[0 2 0], [0 0 0], [0 0 4]])

5 个答案:

答案 0 :(得分:2)

>>> data = [[1, 2, 3], [0, 3, 5], [1, 4, 4]]
>>> info = [1, 0, 2]
>>> map(list.__getitem__, data, info)
[2, 0, 4]

答案 1 :(得分:1)

假设您的数据更可能是numpy数组,或者您安装了numpy,那么可以使用np.choose来实现:

In [3]: import numpy as np

In [4]: matrix = np.array([[1, 2, 3],[0, 3, 5],[1, 4, 4]])

In [5]: vector = np.array([[1], [0], [2]])

In [6]: np.choose(vector.flat, matrix.T)
Out[6]: array([2, 0, 4])
  

选择(a,选择,out =无,模式='加注')       从索引数组和一组数组构造一个数组以供选择。

使用vector.flat获取[1, 0, 2]的迭代器; matrix.T要获取当前matrix的转置视图,np.choose将使用vector作为索引数组。

虽然使用choose的事实仍将迭代vector数组。

答案 2 :(得分:1)

Numpy允许您使用列表或数组进行索引,因此您只需要使用<!doctype html> <html> <body> <ol> <li> <div>Some text</div> </li> </ol> </body> </html>,其中data[i, info]是整个范围,而不仅仅是一个元素,来自您的循环,而i是1d阵列。

info

很难从你的问题中得知,因为你实际上没有发布工作代码,但看起来你的信息数组可能有形状(3,1)而不是(3,)。在这种情况下,您只需添加import numpy as np data = np.array([[1, 2, 3], [0, 3, 5], [1, 4, 4]]) info = np.array([1, 0, 2]) i = np.arange(data.shape[0]) print(data[i, info]) # array([2, 0, 4])

ravel

答案 3 :(得分:0)

您需要将BackgroundWorker这两个列表放在一起,以便将第一个列表编入索引。

zip

答案 4 :(得分:0)

没有循环?好的,没有循环。

>>> m = [[1,2,3], [0,3,5], [1,4,4]]
>>> v = [1,0,2]
>>> def match(a, b):
...     return match_core([], iter(a), iter(b))
...
>>> def match_core(l, a, b):
...     l.append(next(a)[next(b)])
...     try:
...         return match_core(l, a, b)
...     except StopIteration:
...         return l
...
>>> match(m, v)
[2, 0, 4]