python矢量化后打印生成器列表?

2024-09-28 20:20:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我是新来的矢量化和生成器。到目前为止,我已经创建了以下函数:

import numpy as np

def ismember(a,b):
    for i in a:
        if len(np.where(b==i)[0]) == 0:
            lv_var = 0
        else:
            lv_var = np.int(np.where(b==i)[0])
        yield lv_var

vect = np.vectorize(ismember)

A = np.array(xrange(700000))
B = np.array(xrange(700000))

lv_result = vect(A,B)

当我试图将lv_result转换为一个列表或循环遍历结果numpy数组时,我得到了一个生成器对象的列表。我得想办法得到实际结果。如何打印此函数的实际结果?^生成器上的{}似乎无法完成此任务。在

有人能告诉我我做错了什么吗?或者我如何重新配置代码以实现最终目标?在

---------------------------------------------------在

好了,我现在理解了向量化部分(谢谢您的示例Viet Nguyen)。
我还可以打印生成器对象的结果。代码已被修改。请看下面。在

对于发电机部分:

我要做的是模拟一个名为ismember(格式为:[Lia,Locb]=ismember(a,B)的MATLAB函数。我只是想弄到Locb的零件。在

From Matlab: Locb, contain the lowest index in B for each value in A that is a member of B. The output array, Locb, contains 0 wherever A is not a member of B

其中一个主要问题是我需要尽可能高效地执行这个操作。为了测试,我有两个700k元素的数组。创建一个生成器并查看生成器的值似乎不会获得更好的性能。在

为了打印生成器,我在下面创建了函数f()。在

^{pr2}$

注意:如果我们要用较小的数组尝试上述代码: 我们说吧。在

A=np.数组([3,4,4,3,6])

B=np.数组([2,5,2,6,3])

结果将是一个数组:[4 0 0 4 3]

就像matlabs函数一样:目标是为A中属于B的每个值获取B中的最低索引。如果A不是B的成员,则输出数组Locb包含0

Numpy的交集函数不能帮助我实现目标。同样,返回数组的大小需要保持与数组A的大小相同

到目前为止,这个过程需要花费很长时间(对于700k个元素的数组)。不幸的是,我还没有找到最好的解决办法。任何关于如何重新配置代码以实现最终目标、以最佳性能的输入都将非常感谢。在


优化问题解决于:

python-run-generator-using-multiple-cores-for-optimization


Tags: 函数代码innumpyforvarnp数组
1条回答
网友
1楼 · 发布于 2024-09-28 20:20:15

我相信您误解了numpy.vectorize函数的输入。“矢量化”函数按元素对数组进行操作(see ^{} reference)。您的函数ismember似乎假定输入a和{}是数组。相反,请将该函数想象为您将与内置的map()一起使用的功能。在

> import numpy as np
> def mask(a, b):
>   return 1 if a == b else 0
> a = np.array([1, 2, 3, 4])
> b = np.array([1, 3, 4, 5])
> maskv = np.vectorize(mask)
> maskv(a, b)
  array([1, 0, 0, 0])

另外,如果我正确理解你的意图,NumPy带有一个intersection function。在

相关问题 更多 >