np.vectorize 在 2-D numpy 数组作为输入时失败



我正在尝试矢量化一个将 numpy 数组作为输入的函数。我有一个 2-d 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.

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

到这个时候,我想你已经解决了你的问题。但是,我刚刚找到了解决此问题的方法,并可能帮助其他人解决相同的问题。您可以将signature="str"参数传递给np.vectorize以指定输入和输出形状。例如,签名"(n) -> ()"需要长度为(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])

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

for row in some_array:
    i0, i1, loc = fun(row)
这取决于

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

解决这些问题后,如果要创建输出数组:

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

相关内容

最新更新