当函数包含条件时,我在将函数应用于数组时遇到了困难。我有一个低效的变通办法,正在寻找一种有效(快速)的方法。举个简单的例子:
pts = np.linspace(0,1,11)
def fun(x, y):
if x > y:
return 0
else:
return 1现在,如果我运行:
result = fun(pts, pts)然后我得到了错误
ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all()
在if x > y生产线上长大。我的低效变通方法,给出正确的结果,但速度太慢:
result = np.full([len(pts)]*2, np.nan)
for i in range(len(pts)):
for j in range(len(pts)):
result[i,j] = fun(pts[i], pts[j])以更好(更重要的是,更快)的方式获得它的最好方法是什么?
当函数包含条件时,我在将函数应用于数组时遇到了困难。我有一个低效的变通办法,正在寻找一种有效(快速)的方法。举个简单的例子:
pts = np.linspace(0,1,11)
def fun(x, y):
if x > y:
return 0
else:
return 1现在,如果我运行:
result = fun(pts, pts)然后我得到了错误
ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all()
在if x > y生产线上长大。我的低效变通方法,给出正确的结果,但速度太慢:
result = np.full([len(pts)]*2, np.nan)
for i in range(len(pts)):
for j in range(len(pts)):
result[i,j] = fun(pts[i], pts[j])以更好(更重要的是,更快)的方式获得它的最好方法是什么?
编辑:使用
def fun(x, y):
if x > y:
return 0
else:
return 1
x = np.array(range(10))
y = np.array(range(10))
xv,yv = np.meshgrid(x,y)
result = fun(xv, yv) 仍然会引发相同的ValueError。
发布于 2018-12-03 21:25:34
这个错误是非常明显的-假设您有
x = np.array([1,2])
y = np.array([2,1])这样的话
(x>y) == np.array([0,1])if np.array([0,1])语句的结果应该是什么?这是对还是错?numpy告诉你这是模棱两可的。使用
(x>y).all()或
(x>y).any()是明确的,因此numpy为您提供了解决方案-无论是任何单元格对满足条件,还是所有单元格对都满足条件-两者都是明确的真值。你必须自己定义,你所说的向量x大于向量y是什么意思。
在所有x和y对上运行的numpy解决方案,使得x[i]>y[j]使用网格网格来生成所有对:
>>> import numpy as np
>>> x=np.array(range(10))
>>> y=np.array(range(10))
>>> xv,yv=np.meshgrid(x,y)
>>> xv[xv>yv]
array([1, 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5, 6, 7, 8, 9, 3, 4, 5, 6, 7, 8,
9, 4, 5, 6, 7, 8, 9, 5, 6, 7, 8, 9, 6, 7, 8, 9, 7, 8, 9, 8, 9, 9])
>>> yv[xv>yv]
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 7, 8])将xv和yv发送到fun,或者在函数中创建网格,具体取决于哪个更有意义。这将生成所有成对的xi,yj,使得xi>yj。如果您想要实际的索引,只需返回xv>yv,其中每个单元格ij对应x[i]和y[j]。在您的案例中:
def fun(x, y):
xv,yv=np.meshgrid(x,y)
return xv>yv将返回一个矩阵,如果为x[i]>y[j],则fun(x,y)[i][j]为True,否则为False。另一个选择
return np.where(xv>yv)将返回由索引对的两个数组组成的元组,以便
for i,j in fun(x,y):也将保证x[i]>y[j]。
https://stackoverflow.com/questions/53594769
复制相似问题