Numpy vectorize 其中元素是元组
Numpy vectorize where element is tuple
我正在尝试了解 np.vectorize 的工作原理。我想遍历一个数组,其中每个元素都是一个元组,然后修改元组中的每个元素,但这似乎不起作用。
arr = [(1,3), (9,12)]
def func(i):
return (i[0]+1, i[1]+2)
vfunc = np.vectorize(func)
vfunc(arr)
这将是预期的输出:
[(2,5), (10,14)]
请帮助我理解为什么它不遍历每个元组,以及我将如何实现这一点——不使用 for 循环。
使用
[func(i) for i in arr]
np.vectorize
,即使它工作的地方也不是更快。
或
np.array(arr)+np.array([[1,2]])
对于真正的 numpy 'vectorized' 计算,将 (1,2) 数组添加到 (2,2) 数组。
p.s.
arr
是一个 list 元组。如果你能构造一个元组数组,我会重新讨论这个问题。
编辑
我们应该反对,因为你没有提供错误信息!特别是因为你试图理解 vectorize
.
In [307]: np.array(arr)
Out[307]:
array([[ 1, 3],
[ 9, 12]])
In [308]: vfunc = np.vectorize(func)
...: vfunc(arr)
Traceback (most recent call last):
File "<ipython-input-308-61dee032d8f1>", line 2, in <module>
vfunc(arr)
File "/usr/local/lib/python3.8/dist-packages/numpy/lib/function_base.py", line 2163, in __call__
return self._vectorize_call(func=func, args=vargs)
File "/usr/local/lib/python3.8/dist-packages/numpy/lib/function_base.py", line 2241, in _vectorize_call
ufunc, otypes = self._get_ufunc_and_otypes(func=func, args=args)
File "/usr/local/lib/python3.8/dist-packages/numpy/lib/function_base.py", line 2201, in _get_ufunc_and_otypes
outputs = func(*inputs)
File "<ipython-input-306-ab62cb78d2b7>", line 4, in func
return (i[0]+1, i[1]+2)
IndexError: invalid index to scalar variable.
您的函数中出现错误是因为您试图索引一个 标量变量。 i
是数字,不是元组。
测试我最初的建议:
In [309]: [func(i) for i in arr]
Out[309]: [(2, 5), (10, 14)]
In [310]: np.array(arr)+np.array([1,2])
Out[310]:
array([[ 2, 5],
[10, 14]])
或者制作一个 2 元素数组:
In [311]: A = np.empty(2, object)
In [312]: A[:]=arr
In [313]: A
Out[313]: array([(1, 3), (9, 12)], dtype=object)
In [314]: A[0]
Out[314]: (1, 3)
In [315]: vfunc(A)
Out[315]: (array([ 2, 10]), array([ 5, 14]))
将此 A
与 Out[307]
进行比较。非常不同的数组。
诊断此问题的另一种方法是向函数添加打印。
In [317]: def func(i):
...: print(i)
...: return (i[0]+1, i[1]+2)
...:
In [318]: vfunc = np.vectorize(func)
In [319]: vfunc(arr)
1
Traceback (most recent call last):
File "<ipython-input-319-62576075c0b8>", line 1, in <module>
...
IndexError: invalid index to scalar variable.
vectorized
传递 np.array(arr)
的第一个元素,而不是 arr
的第一个元组,标量 1
.
应用于对象数组:
In [320]: vfunc(A)
(1, 3) # the documented trial call
(1, 3)
(9, 12)
Out[320]: (array([ 2, 10]), array([ 5, 14]))
现在我们看到它正在将元组传递给函数。
我正在尝试了解 np.vectorize 的工作原理。我想遍历一个数组,其中每个元素都是一个元组,然后修改元组中的每个元素,但这似乎不起作用。
arr = [(1,3), (9,12)]
def func(i):
return (i[0]+1, i[1]+2)
vfunc = np.vectorize(func)
vfunc(arr)
这将是预期的输出:
[(2,5), (10,14)]
请帮助我理解为什么它不遍历每个元组,以及我将如何实现这一点——不使用 for 循环。
使用
[func(i) for i in arr]
np.vectorize
,即使它工作的地方也不是更快。
或
np.array(arr)+np.array([[1,2]])
对于真正的 numpy 'vectorized' 计算,将 (1,2) 数组添加到 (2,2) 数组。
p.s.
arr
是一个 list 元组。如果你能构造一个元组数组,我会重新讨论这个问题。
编辑
我们应该反对,因为你没有提供错误信息!特别是因为你试图理解 vectorize
.
In [307]: np.array(arr)
Out[307]:
array([[ 1, 3],
[ 9, 12]])
In [308]: vfunc = np.vectorize(func)
...: vfunc(arr)
Traceback (most recent call last):
File "<ipython-input-308-61dee032d8f1>", line 2, in <module>
vfunc(arr)
File "/usr/local/lib/python3.8/dist-packages/numpy/lib/function_base.py", line 2163, in __call__
return self._vectorize_call(func=func, args=vargs)
File "/usr/local/lib/python3.8/dist-packages/numpy/lib/function_base.py", line 2241, in _vectorize_call
ufunc, otypes = self._get_ufunc_and_otypes(func=func, args=args)
File "/usr/local/lib/python3.8/dist-packages/numpy/lib/function_base.py", line 2201, in _get_ufunc_and_otypes
outputs = func(*inputs)
File "<ipython-input-306-ab62cb78d2b7>", line 4, in func
return (i[0]+1, i[1]+2)
IndexError: invalid index to scalar variable.
您的函数中出现错误是因为您试图索引一个 标量变量。 i
是数字,不是元组。
测试我最初的建议:
In [309]: [func(i) for i in arr]
Out[309]: [(2, 5), (10, 14)]
In [310]: np.array(arr)+np.array([1,2])
Out[310]:
array([[ 2, 5],
[10, 14]])
或者制作一个 2 元素数组:
In [311]: A = np.empty(2, object)
In [312]: A[:]=arr
In [313]: A
Out[313]: array([(1, 3), (9, 12)], dtype=object)
In [314]: A[0]
Out[314]: (1, 3)
In [315]: vfunc(A)
Out[315]: (array([ 2, 10]), array([ 5, 14]))
将此 A
与 Out[307]
进行比较。非常不同的数组。
诊断此问题的另一种方法是向函数添加打印。
In [317]: def func(i):
...: print(i)
...: return (i[0]+1, i[1]+2)
...:
In [318]: vfunc = np.vectorize(func)
In [319]: vfunc(arr)
1
Traceback (most recent call last):
File "<ipython-input-319-62576075c0b8>", line 1, in <module>
...
IndexError: invalid index to scalar variable.
vectorized
传递 np.array(arr)
的第一个元素,而不是 arr
的第一个元组,标量 1
.
应用于对象数组:
In [320]: vfunc(A)
(1, 3) # the documented trial call
(1, 3)
(9, 12)
Out[320]: (array([ 2, 10]), array([ 5, 14]))
现在我们看到它正在将元组传递给函数。