np.vectorize 将二维 numpy 数组作为输入失败
np.vectorize fails on a 2-d numpy array as input
我正在尝试向量化一个以 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 行),这是索引错误的原因,但我是不知道如何解决这个问题。
vectorize
对数组的每个元素运行您的函数,因此这不是正确的选择。改为使用常规循环:
for row in some_array:
i0, i1, loc = fun(row)
要对输出做什么取决于您。请记住,如果 len(location) <= 1
,您的函数不会分配 location1
,并且在这种情况下会引发错误。它还 returns 第三个输出中的字符串而不是数值。
一旦你解决了这些问题,如果你想制作一个输出数组:
output = np.empty((some_array.shape[0], 3))
for i, row in enumerate(some_array):
output[i, :] = fun(row)
到这个时候我想你已经解决了你的问题。但是,我刚刚找到了解决此问题的方法,并且可能会帮助其他有相同问题的人。您可以将 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])
我正在尝试向量化一个以 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 行),这是索引错误的原因,但我是不知道如何解决这个问题。
vectorize
对数组的每个元素运行您的函数,因此这不是正确的选择。改为使用常规循环:
for row in some_array:
i0, i1, loc = fun(row)
要对输出做什么取决于您。请记住,如果 len(location) <= 1
,您的函数不会分配 location1
,并且在这种情况下会引发错误。它还 returns 第三个输出中的字符串而不是数值。
一旦你解决了这些问题,如果你想制作一个输出数组:
output = np.empty((some_array.shape[0], 3))
for i, row in enumerate(some_array):
output[i, :] = fun(row)
到这个时候我想你已经解决了你的问题。但是,我刚刚找到了解决此问题的方法,并且可能会帮助其他有相同问题的人。您可以将 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])