所以在numpy
中我们有一个reduce
函数,我们可以通过将函数应用于该维度上的元素来减少数组的一维。这个函数是否也有一个逆函数,可以将一个元素扩展到一个全新的维度?
假设我有两个数组:
class A:
def __init__(self, a, b, c):
self.value = a, b, c
a = np.array([A(1,2,3), A(4,5,6)])
b = np.array([1<<8 | 2<<4 | 3, 4<<8 | 5<<4 | 6])
我想把这两个数组中的任何一个
np.array([[1,2,3],[4,5,6]])
我目前正在做的是:
def expand(arr):
a = np.empty((*arr.shape, 3))
for x, y in np.ndindex(arr.shape):
if isinstance(arr[x,y], A):
a[x,y] = arr[x,y].value
else:
a[x,y] = arr[x,y] >> 8, arr[x,y] >> 4 & 0xF, arr[x,y] & 0xF
return a
这工作,但我想避免(慢?)迭代,因为它违背了numpy
的精神。
我也尝试过使用np.vectorize
的解决方案,但它并不像我希望的那样工作:
def expanded(element):
if isinstance(element, A):
return element.value
return element >> 8, element >> 4 & 0xF, element & 0xF
f = np.vectorize(expanded)
f(a) # Prints a tuple of arrays instead of the desired single array
是否有更好的方法将单个值扩展到新的维度,通过某种数学运算或通过对象属性访问?
1条答案
按热度按时间fae0ux8s1#
您的
A
示例数组。定义一个
__repr__
以获得更漂亮的显示。在示例上迭代,返回
value
:它可以转换为一个数组,其中:
或
vectorize
为示例返回的每个值创建一个数组,这里有3个数组:它可以被转换为前一个数组的转置:
返回一个数组(而不是元组),并指定otypes,给出另一个对象dtype array:
signature
可以直接生成数字数组。我不认为这会更快。vectorize
的一个更基本的版本直接返回一个对象dtype数组:这个小例子的比较时间不会告诉我们太多。你需要探索一个更现实的大小
a
。快速
numpy
代码适用于数字数据类型。对于对象,dtype的速度都近似等于列表解析。