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