Python 在二维坐标系中调用函数最有效的方法是什么?

Python 在二维坐标系中调用函数最有效的方法是什么?,python,numpy,Python,Numpy,我有一个大小的数组(M,N,3)。它包含M x N个点,每个点都由其x、y和z坐标标识。我还有一个函数'foo'“foo”将一个点作为大小(,3)的数组。在数组中的每个M x N点上调用“foo”是否比使用两个嵌套for循环更快 到目前为止,这就是我所尝试的。我的数组是变量“sample\u array” num_rows = sample_array.shape[0] num_columns = sample_array.shape[1] solution = np.zeros((num_ro

我有一个大小的数组(M,N,3)。它包含M x N个点,每个点都由其x、y和z坐标标识。我还有一个函数'foo'“foo”将一个点作为大小(,3)的数组。在数组中的每个M x N点上调用“foo”是否比使用两个嵌套for循环更快

到目前为止,这就是我所尝试的。我的数组是变量“sample\u array”

num_rows = sample_array.shape[0]
num_columns = sample_array.shape[1]
solution = np.zeros((num_rows, num_columns))

for row in range(num_rows):
   for column in range(num_columns):
      point = sample_array[row, column]
      solution[row, column] = foo(point)
我发现了这一点,它描述了如何使用这两种解决方案:

np.vectorize(foo)
np.array(map(foo, sample_array))
但是,我不确定如何指定我不希望函数映射到每个mxnx3浮点。相反,我希望它映射要在每个mxn(,3)ndarray上调用的函数


谢谢大家!

使用
map
的一种方法是:

solution = np.array(list(map(foo, sample_array.reshape(-1,3)) ))\
             .reshape(sample_array.shape[:2])

理想情况下,您正在调用的函数
foo
将接受数组作为输入。一般来说,任何函数都可以接受所有数组,只要第一个维度符合预期。例如,函数

导入numpy
def长度(x):
返回numpy.sqrt(x[0]**2+x[1]**2+x[2]**2)
计算向量的长度,但也接受形状数组
(3,…)
(甚至不管后面有多少个维度),并执行正确的操作

这种设计具有以下优点:

  • 该代码适用于标量和数组
  • 它适用于任意维数的数组
  • (C-连续排序)
  • 它通常会产生干净的代码

您可以尝试
np。沿_轴应用_(函数,轴=2,arr=您的_输入_数组)
这将沿第三轴切片阵列,并将函数应用于每个切片,即点


在此处找到文档,代码行数更少:

solution = np.vectorize(foo)(*sample_array.reshape(-1, 3).T)

对于一般函数
foo
,简单的答案是否定的。
map
np.vectorize
和您一样,都是编写For循环的奇特方法。@quanghaang感谢您的回答!有没有一种方法可以使用map、np.vectorize或其他函数来至少减少所需的代码行数?只要该函数只接受1个点,您就无法提高速度。它必须被调用
N*M
次;这是主要的时间消费。谢谢你的回答。这就要求输入的形状是(3,M,N),对吗?是否有一种方法可以实现这一点,使用你的方法,可以在形状(M,N,3)中实现?以这种方式存储我的点会是一种不好的做法吗?将数组存储为
(n,3)
,这是非常常见的,主要是因为
print()
ing看起来更好。实际上,在计算上更有效的方法是将前导维保持在较小的范围内。当然,您可以始终使用
moveaxis
,但这实际上会在内存中移动,并且需要时间。我会组织代码,使数组的形状从一开始就是
(3,…)
。@hpaulj它不是。用
list
更新后,它就可以工作了。根据我的经验,这个
apply
很方便,但不是更快。