Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.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 不使用循环从索引中提取值_Python_Numpy_Matrix_Vectorization - Fatal编程技术网

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
以及所需的输出。我不知道为什么这是否决票