numpy中结构化数组的元素明智总和
element wise sum of structured arrays in numpy
我想知道是否有可能对两个形状相同的结构化 numpy 数组执行逐元素求和(或其他操作)。
arr1 = np.array([[1,2,3],[2,3,4]], dtype=[("x", "f8"),("y", "f8")])
arr2 = np.array([[5,4,3],[9,6,4]], dtype=[("x", "f8"),("y", "f8")])
arr3 = np.sum(arr1, arr2)
说“ufunc 'add' 不包含签名匹配类型 dtype([('x', '
如果不可能,那么理解为什么在 numpy 中实现不可能或不切实际会很棒。
使用你的阵列:
In [236]: arr1 = np.array([[1,2,3],[2,3,4]], dtype=[("x", "f8"),("y", "f8")])
In [237]: arr1
Out[237]:
array([[(1., 1.), (2., 2.), (3., 3.)],
[(2., 2.), (3., 3.), (4., 4.)]], dtype=[('x', '<f8'), ('y', '<f8')])
In [238]: arr1['x']
Out[238]:
array([[1., 2., 3.],
[2., 3., 4.]])
通常,结构化数组的数据以元组列表的形式提供,与 Out[237]
中显示的相同。没有元组 np.array
为两个字段分配相同的值。
您必须分别对每个字段进行数学计算:
In [239]: arr1['y'] *= 10
In [240]: arr1
Out[240]:
array([[(1., 10.), (2., 20.), (3., 30.)],
[(2., 20.), (3., 30.), (4., 40.)]],
dtype=[('x', '<f8'), ('y', '<f8')])
数学运算是为 int
和 float
等简单数据类型定义的,并尽可能使用编译代码。
此错误意味着 add
ufunc
尚未为此复合 dtype 定义。我认为所有复合数据类型都是如此。
In [242]: arr1 + arr1
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-242-345397c600ce> in <module>()
----> 1 arr1 + arr1
TypeError: ufunc 'add' did not contain a loop with signature matching types dtype([('x', '<f8'), ('y', '<f8')]) dtype([('x', '<f8'), ('y', '<f8')]) dtype([('x', '<f8'), ('y', '<f8')])
由于本例中的字段具有相同的基本数据类型,我们可以定义另一个可以 'view' 的复合数据类型:
In [243]: dt2 = np.dtype([('xy', 'f8', 2)])
In [244]: arr2 = arr1.view(dt2)
In [245]: arr2
Out[245]:
array([[([ 1., 10.],), ([ 2., 20.],), ([ 3., 30.],)],
[([ 2., 20.],), ([ 3., 30.],), ([ 4., 40.],)]],
dtype=[('xy', '<f8', (2,))])
In [246]: arr2['xy']
Out[246]:
array([[[ 1., 10.],
[ 2., 20.],
[ 3., 30.]],
[[ 2., 20.],
[ 3., 30.],
[ 4., 40.]]])
该字段上的数学将显示在原始数组中:
In [247]: arr2['xy'] += .1
In [248]: arr2
Out[248]:
array([[([ 1.1, 10.1],), ([ 2.1, 20.1],), ([ 3.1, 30.1],)],
[([ 2.1, 20.1],), ([ 3.1, 30.1],), ([ 4.1, 40.1],)]],
dtype=[('xy', '<f8', (2,))])
In [249]: arr1
Out[249]:
array([[(1.1, 10.1), (2.1, 20.1), (3.1, 30.1)],
[(2.1, 20.1), (3.1, 30.1), (4.1, 40.1)]],
dtype=[('x', '<f8'), ('y', '<f8')])
我们也可以view
它作为一个简单的dtype,但必须调整形状:
In [250]: arr3 = arr1.view('f8')
In [251]: arr3
Out[251]:
array([[ 1.1, 10.1, 2.1, 20.1, 3.1, 30.1],
[ 2.1, 20.1, 3.1, 30.1, 4.1, 40.1]])
In [252]: arr3.reshape(2,3,2)
Out[252]:
array([[[ 1.1, 10.1],
[ 2.1, 20.1],
[ 3.1, 30.1]],
[[ 2.1, 20.1],
[ 3.1, 30.1],
[ 4.1, 40.1]]])
我想知道是否有可能对两个形状相同的结构化 numpy 数组执行逐元素求和(或其他操作)。
arr1 = np.array([[1,2,3],[2,3,4]], dtype=[("x", "f8"),("y", "f8")])
arr2 = np.array([[5,4,3],[9,6,4]], dtype=[("x", "f8"),("y", "f8")])
arr3 = np.sum(arr1, arr2)
说“ufunc 'add' 不包含签名匹配类型 dtype([('x', '
如果不可能,那么理解为什么在 numpy 中实现不可能或不切实际会很棒。
使用你的阵列:
In [236]: arr1 = np.array([[1,2,3],[2,3,4]], dtype=[("x", "f8"),("y", "f8")])
In [237]: arr1
Out[237]:
array([[(1., 1.), (2., 2.), (3., 3.)],
[(2., 2.), (3., 3.), (4., 4.)]], dtype=[('x', '<f8'), ('y', '<f8')])
In [238]: arr1['x']
Out[238]:
array([[1., 2., 3.],
[2., 3., 4.]])
通常,结构化数组的数据以元组列表的形式提供,与 Out[237]
中显示的相同。没有元组 np.array
为两个字段分配相同的值。
您必须分别对每个字段进行数学计算:
In [239]: arr1['y'] *= 10
In [240]: arr1
Out[240]:
array([[(1., 10.), (2., 20.), (3., 30.)],
[(2., 20.), (3., 30.), (4., 40.)]],
dtype=[('x', '<f8'), ('y', '<f8')])
数学运算是为 int
和 float
等简单数据类型定义的,并尽可能使用编译代码。
此错误意味着 add
ufunc
尚未为此复合 dtype 定义。我认为所有复合数据类型都是如此。
In [242]: arr1 + arr1
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-242-345397c600ce> in <module>()
----> 1 arr1 + arr1
TypeError: ufunc 'add' did not contain a loop with signature matching types dtype([('x', '<f8'), ('y', '<f8')]) dtype([('x', '<f8'), ('y', '<f8')]) dtype([('x', '<f8'), ('y', '<f8')])
由于本例中的字段具有相同的基本数据类型,我们可以定义另一个可以 'view' 的复合数据类型:
In [243]: dt2 = np.dtype([('xy', 'f8', 2)])
In [244]: arr2 = arr1.view(dt2)
In [245]: arr2
Out[245]:
array([[([ 1., 10.],), ([ 2., 20.],), ([ 3., 30.],)],
[([ 2., 20.],), ([ 3., 30.],), ([ 4., 40.],)]],
dtype=[('xy', '<f8', (2,))])
In [246]: arr2['xy']
Out[246]:
array([[[ 1., 10.],
[ 2., 20.],
[ 3., 30.]],
[[ 2., 20.],
[ 3., 30.],
[ 4., 40.]]])
该字段上的数学将显示在原始数组中:
In [247]: arr2['xy'] += .1
In [248]: arr2
Out[248]:
array([[([ 1.1, 10.1],), ([ 2.1, 20.1],), ([ 3.1, 30.1],)],
[([ 2.1, 20.1],), ([ 3.1, 30.1],), ([ 4.1, 40.1],)]],
dtype=[('xy', '<f8', (2,))])
In [249]: arr1
Out[249]:
array([[(1.1, 10.1), (2.1, 20.1), (3.1, 30.1)],
[(2.1, 20.1), (3.1, 30.1), (4.1, 40.1)]],
dtype=[('x', '<f8'), ('y', '<f8')])
我们也可以view
它作为一个简单的dtype,但必须调整形状:
In [250]: arr3 = arr1.view('f8')
In [251]: arr3
Out[251]:
array([[ 1.1, 10.1, 2.1, 20.1, 3.1, 30.1],
[ 2.1, 20.1, 3.1, 30.1, 4.1, 40.1]])
In [252]: arr3.reshape(2,3,2)
Out[252]:
array([[[ 1.1, 10.1],
[ 2.1, 20.1],
[ 3.1, 30.1]],
[[ 2.1, 20.1],
[ 3.1, 30.1],
[ 4.1, 40.1]]])