在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)
返回距离
是否有更好/更快/更有效的方法从mynp.ndarray
获取值?我是否可以将整个数组传递到myFunc
?问题是int(x)
和int(y)
,不知道如何在Python中处理数组
编辑1-返回myFunc时出错,应该使用e0添加500
编辑2-gen.noise2d是从到“从X,Y坐标生成2D OpenSimplex噪波”。如果满足以下两个条件,则可以完全矢量化代码:
gen.noise2d
可矢量化(可能使用下面所示的技术),或可忽略myFunc
是一个python函数,而不是用C编写的函数int
itmyFunc
的全局命名空间以引用或。后者更接近当前代码中的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
模块的指令。如果您想在该模块的其他地方使用realint
,这可能是一件坏事。由于\uuuu globals\uuuu
属性是只读的,因此可以使用原始代码和不同的globals创建函数对象的副本。这可能有点过头了,所以我会将您链接到以下帖子:
也许更简单的解决方案是将不同的对象绑定到名称myFunc
,并将其分配给相应的模块?如果满足以下两个条件,则可以完全矢量化代码:
gen.noise2d
可矢量化(可能使用下面所示的技术),或可忽略
myFunc
是一个python函数,而不是用C编写的函数
您可以monkeypatch名称int
itmyFunc
的全局命名空间以引用或。后者更接近当前代码中的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
模块的指令。如果您想在该模块的其他地方使用realint
,这可能是一件坏事。由于\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从现在开始说noise2dxsb=floor(xs)
中的行是罪魁祸首,给出了错误消息TypeError:只有大小为1的数组才能转换为Python标量。这是因为math.floor
调用输入上的\uuuuuuuuuuuuuuuuuuuu
。Numpy阵列可以很好地支持这一点,