Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.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中,将np.array传递给函数的最佳方法是什么?_Python_Numpy - Fatal编程技术网

在Python中,将np.array传递给函数的最佳方法是什么?

在Python中,将np.array传递给函数的最佳方法是什么?,python,numpy,Python,Numpy,我有这样一个函数(我无法更改): 现在,我正在尝试对代码的其他部分使用np.ndarray,并在循环中一次传递一个x和y值: # passing in a particles which is an array like this: # [[2,4], [5, 9], [2, 5]] # this array would have more than 5000 pairs of x, y coordinates def mapFunc(particles): N = len(p

我有这样一个函数(我无法更改):

现在,我正在尝试对代码的其他部分使用
np.ndarray
,并在循环中一次传递一个
x
y
值:

# passing in a particles which is an array like this:
#     [[2,4], [5, 9], [2, 5]]
# this array would have more than 5000 pairs of x, y coordinates

def mapFunc(particles):
    N = len(particles)
    mask = []
    distance = []

    for i in range(N):
        x = particles[i][0]
        y = particles[i][1]
        ground_dist = mapFunc(x, y)
 
        # add in the distances to the ground
        distance.append(ground_dist)

        # add True if the ground is less than 50 feet away
        mask.append(ground_dist < 50)

    return distance, mask
#传入一个粒子,该粒子是一个如下数组:
#     [[2,4], [5, 9], [2, 5]]
#这个数组将有5000多对x,y坐标
def mapFunc(粒子):
N=len(粒子)
掩码=[]
距离=[]
对于范围(N)中的i:
x=粒子[i][0]
y=粒子[i][1]
地面距离=mapFunc(x,y)
#加上与地面的距离
附加距离(地面距离)
#如果地面距离小于50英尺,则添加True
附加屏蔽(地面距离<50)
返回距离
是否有更好/更快/更有效的方法从my
np.ndarray
获取值?我是否可以将整个数组传递到
myFunc
?问题是
int(x)
int(y)
,不知道如何在Python中处理数组

编辑1-返回myFunc时出错,应该使用e0添加500


编辑2-gen.noise2d是从到“从X,Y坐标生成2D OpenSimplex噪波”。

如果满足以下两个条件,则可以完全矢量化代码:

  • gen.noise2d
    可矢量化(可能使用下面所示的技术),或可忽略
  • myFunc
    是一个python函数,而不是用C编写的函数
  • 您可以monkeypatch名称
    int
    it
    myFunc
    的全局命名空间以引用或。后者更接近当前代码中的
    int

    myFunc.__globals__['int'] = np.trunc
    
    您可能需要修改
    myFunc.\uuuu globals\uuuu['gen']['noise2d']
    的依赖项,或者将其完全替换掉。或者,您可能希望完全忽略
    noise2d
    函数,因为它的结果一开始似乎没有被使用

    现在,您可以按如下方式重写代码:

    def mapFunc(particles):
        particles = np.asarray(particles)
        distance = myFunc(*particles.T)
        mask = distance < 50
        return distance, mask
    
    def mapFunc(粒子):
    粒子=np.asarray(粒子)
    距离=myFunc(*particles.T)
    遮罩=距离<50
    返回距离
    
    myFunc.\uuuu globals\uuu['int']=np.trunc
    将修改中定义的
    myFunc
    模块的
    指令。如果您想在该模块的其他地方使用real
    int
    ,这可能是一件坏事。由于
    \uuuu globals\uuuu
    属性是只读的,因此可以使用原始代码和不同的globals创建函数对象的副本。这可能有点过头了,所以我会将您链接到以下帖子:


    也许更简单的解决方案是将不同的对象绑定到名称
    myFunc
    ,并将其分配给相应的模块?

    如果满足以下两个条件,则可以完全矢量化代码:

  • gen.noise2d
    可矢量化(可能使用下面所示的技术),或可忽略
  • myFunc
    是一个python函数,而不是用C编写的函数
  • 您可以monkeypatch名称
    int
    it
    myFunc
    的全局命名空间以引用或。后者更接近当前代码中的
    int

    myFunc.__globals__['int'] = np.trunc
    
    您可能需要修改
    myFunc.\uuuu globals\uuuu['gen']['noise2d']
    的依赖项,或者将其完全替换掉。或者,您可能希望完全忽略
    noise2d
    函数,因为它的结果一开始似乎没有被使用

    现在,您可以按如下方式重写代码:

    def mapFunc(particles):
        particles = np.asarray(particles)
        distance = myFunc(*particles.T)
        mask = distance < 50
        return distance, mask
    
    def mapFunc(粒子):
    粒子=np.asarray(粒子)
    距离=myFunc(*particles.T)
    遮罩=距离<50
    返回距离
    
    myFunc.\uuuu globals\uuu['int']=np.trunc
    将修改中定义的
    myFunc
    模块的
    指令。如果您想在该模块的其他地方使用real
    int
    ,这可能是一件坏事。由于
    \uuuu globals\uuuu
    属性是只读的,因此可以使用原始代码和不同的globals创建函数对象的副本。这可能有点过头了,所以我会将您链接到以下帖子:


    也许更简单的解决方案是将不同的对象绑定到名称
    myFunc
    ,并将其分配给相应的模块?

    mapFunc()==myFunc()
    ?您的意思是
    myFunc(*particle[i])
    ?(假设数组中只有两个元素)我不确定是否有助于摆脱Pythonloop@ThomasWeller.
    vectorize
    是一个python循环。如果您不能更改该函数,那么numpy对您来说真的没有什么用处。
    mapFunc()==myFunc()
    ?您的意思是
    myFunc(*particle[i])vectorize
    是一个python循环。如果您不能更改该函数,numpy将不会为您提供太多帮助。谢谢!这似乎是在正确的轨道上。我在问题中犯了一个错误,它在返回行中使用了noise2d结果的结果,我刚刚在问题
    return e0+500
    @sleo中更正了它。在这种情况下,我建议将该函数添加到问题中。如果这个答案有助于你前进,我建议你点击旁边的复选标记来选择它。这将从未回答的队列中删除您的问题。因此,我深入挖掘了一下,现在看来
    gen.noise2d
    正在引发问题。这是guy从现在开始说noise2d
    xsb=floor(xs)
    中的行是罪魁祸首,给出了错误消息
    TypeError:只有大小为1的数组才能转换为Python标量。这是因为
    math.floor
    调用输入上的
    \uuuuuuuuuuuuuuuuuuuu
    。Numpy阵列可以很好地支持这一点,