【问题标题】:np.vectorize fails on a 2-d numpy array as inputnp.vectorize 在二维 numpy 数组作为输入时失败
【发布时间】:2019-07-16 09:56:16
【问题描述】:

我正在尝试对一个以 numpy 数组作为输入的函数进行矢量化处理。我有一个二维 numpy 数组(形状为 1000,100),函数将应用于 1000 行中的每一行。我尝试使用np.vectorize 对函数进行矢量化。代码如下:

def fun(i):
    print(i)
    location = geocoder.google([i[1], i[0]], method="reverse")
    #print type(location)
    location = str(location)
    location = location.split("Reverse")
    if len(location) > 1:
        location1 = location[1]
    return [i[0], i[1], location1]

#using np.vectorize
vec_fun = np.vectorize(fun)

这会引发错误

<ipython-input-19-1ee9482c6161> in fun(i)
      1 def fun(i):
      2     print(i)
----> 3     location = geocoder.google([i[1], i[0]], method="reverse")
      4     #print type(location)
      5     location = lstr(location)

IndexError: invalid index to scalar variable.

我已经打印了传递给 fun 的参数,该参数打印单个值(向量的第一个元素)而不是向量(1 行),这是索引错误的原因,但我没有得到知道如何解决这个问题。

【问题讨论】:

  • 不使用np.vectorize怎么样?

标签: python numpy vectorization


【解决方案1】:

vectorize 在数组的每个元素上运行您的函数,因此这不是正确的选择。改用常规循环:

for row in some_array:
    i0, i1, loc = fun(row)

您想对输出做什么由您决定。请记住,如果len(location) &lt;= 1,您的函数不会分配location1,并且在这种情况下会引发错误。它还在第三个输出中返回一个字符串而不是一个数值。

一旦你解决了这些问题,如果你想制作一个输出数组:

output = np.empty((some_array.shape[0], 3))
for i, row in enumerate(some_array):
    output[i, :] = fun(row)

【讨论】:

  • 那么,没有办法在 numpy 二维数组的每个一维数组上运行矢量化?
  • @A.kumar。不,而且没有任何意义。 Vectorize 不会神奇地加速或编译 python 代码。无论如何,它只是在后台运行一个美化的循环。
  • 我在这里 (docs.scipy.org/doc/numpy/reference/generated/…) 读到 np.vectorize 使用了 numpy 的广播规则,为什么这对于二维数组是不可能的?
  • @A.kumar。因为广播与你的情况无关。广播意味着当您向接受多个参数的函数提供多个数组时,数组的形状将扩展为沿单位尺寸匹配,因此您最终仍然一次处理一个元素,同步地,跨越所有输入。
  • @RylanSchaeffer。我从来没有发现它的用途。
【解决方案2】:

到这个时候我想你已经解决了你的问题。但是,我刚刚找到了一种解决此问题的方法,并且可以帮助其他有相同问题的人。您可以将signature="str" 参数传递给np.vectorize 以指定输入和输出形状。例如,签名"(n) -&gt; ()" 需要一个长度为(n)(行)的输入形状,并输出一个标量()。因此,它将广播最多行:

def my_sum(row):
    return np.sum(row)

row_sum = np.vectorize(my_sum, signature="(n) -> ()")

my_mat = np.array([
    [1, 1, 1],
    [2, 2, 2],
])

row_sum(my_mat)
OUT: array([3, 6])

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 2014-03-24
  • 2018-07-25
  • 1970-01-01
  • 2020-07-30
  • 2016-03-10
  • 2012-09-16
  • 2013-04-23
  • 1970-01-01
相关资源
最近更新 更多