Python 不使用循环从索引中提取值
所以我有一个包含数据的矩阵和一个包含信息的向量,我应该从矩阵中提取哪些数据。真正的矩阵要长得多,但下面是一个简短的版本,只是为了说明我的意思Python 不使用循环从索引中提取值,python,numpy,matrix,vectorization,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)]
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)]])
简单for循环:
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]])
您需要
zip
将这两个列表合并在一起,这样才能将第一个列表按另一个列表进行索引
answer = map(lambda x: x[0][x[1]], zip(data, info)) # [2, 0, 4]
您需要
zip
将这两个列表合并在一起,这样才能将第一个列表按另一个列表进行索引
answer = map(lambda x: x[0][x[1]], zip(data, info)) # [2, 0, 4]
没有循环?好的,没有循环
>>> 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]
没有循环?好的,没有循环
>>> 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]
假设您的数据更可能是
numpy
数组,或者您安装了numpy
,则可以使用np实现。选择:
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,choices,out=None,mode='raise')
从索引数组和一组可供选择的数组构造一个数组
使用vector.flat
获得[1,0,2]
的迭代器matrix.T
获取当前matrix
的转置视图,np。选择将使用vector
作为索引数组
虽然使用choose
仍然会在向量
数组上迭代。假设您的数据更可能是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,choices,out=None,mode='raise')
从索引数组和一组可供选择的数组构造一个数组
使用vector.flat
获得[1,0,2]
的迭代器matrix.T
获取当前matrix
的转置视图,np。选择将使用vector
作为索引数组
尽管使用choose
仍然会在vector
数组上迭代。Numpy允许您使用列表或数组进行索引,所以您只需要使用data[i,info]
其中i
是循环的整个范围,而不仅仅是一个元素,info
是1d数组
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])
很难从您的问题中分辨出来,因为您实际上没有发布工作代码,但看起来您的信息数组的形状可能是(3,1),而不是(3,)。在这种情况下,您只需添加一个ravel
:
print(data[i, info.ravel()])
# array([2, 0, 4])
Numpy允许您使用列表或数组进行索引,因此您只需使用data[i,info]
即可,其中i
是循环的整个范围,而不仅仅是一个元素,info
是1d数组
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])
很难从您的问题中分辨出来,因为您实际上没有发布工作代码,但看起来您的信息数组的形状可能是(3,1),而不是(3,)。在这种情况下,您只需添加一个ravel
:
print(data[i, info.ravel()])
# array([2, 0, 4])
你的矩阵实际上是什么样子的?它是一个自定义数据结构,还是仅仅是一个列表/一个2D数组?如果它是一个列表,您可以执行list.indexof(item)
您确定您使用了正确的语言吗?[1 2 3;0 3 5;1 4 4]
应该是什么?或者[1;0;2]
?@mystery578。您需要添加简单for循环,因为您的输入数据看起来一点也不像python,但如果是这样,您听起来像是有numpy数组,这与常规python有很大不同lists@mystery578,您有numpy数组,你应该用numpy标记这个问题,因为这里的所有答案都意味着你不再有一个numpy数组。更糟糕的是,它们会导致错误,\uuuu getitem\uuuuuuuuuu
->描述符“\uuuu getitem\uuuuuuuuuuu”需要一个“list”对象,但收到了一个“numpy.ndarray”
您的矩阵实际上是什么样子的?它是一个自定义数据结构,还是仅仅是一个列表/一个2D数组?如果它是一个列表,您可以执行list.indexof(item)
您确定您使用了正确的语言吗?[1 2 3;0 3 5;1 4 4]
应该是什么?或者[1;0;2]
?@mystery578。您需要添加简单for循环,因为您的输入数据看起来一点也不像python,但如果是这样,您听起来像是有numpy数组,这与常规python有很大不同lists@mystery578,您有numpy数组,你应该用numpy标记这个问题,因为这里的所有答案都意味着你不再有一个numpy数组。更糟糕的是,它们会导致错误,\uuuu getitem\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu->描述符需要
是吗?老实说,我不知道我们为什么要在这里避免循环,我也不清楚这个问题的“矢量化”会带来什么。@TigerhawkT3可能,但他说没有for循环。是的,用zip函数解决了这个问题。非常感谢。帮助我学习了python中的一个新函数!随时希望您能充分理解Python并享受它。data=[[1,2,3],[0,3,5],[1,4,4]
和info=[1,0,2]
您最初的循环不是比这个映射(lambda…
更快(更清晰)吗?老实说,我不知道我们为什么要在这里避免循环,我也不清楚这个问题的“矢量化”会带来什么。@TigerhawkT3可能,但他说没有for循环。是的,用zip函数解决了这个问题。非常感谢。帮助我学习了python中的一个新函数!随时希望您能充分理解Python并享受它。为什么会被否决?这是100%直截了当的答案,正如所演示的那样,它是有效的。从技术上讲,您最终会得到一个map
对象,但如果您将它包装在list()
中,它将提供一个list
以及所需的输出。我不知道为什么这是否决票