首页 > 解决方案 > 如何将一个结构化 Numpy 数组的切片分配给另一个?

问题描述

我有两个 numpy 结构化数组arr1arr2.
arr1有字段['f1','f2','f3']
arr2有字段['f1','f2','f3','f4']
IE:

arr1 = [[f1_1_1,  f2_1_1,  f3_1_1 ],    arr2 = [[f1_2_1,  f2_2_1,  f3_2_1,  f4_2_1 ],
        [f1_1_2,  f2_1_2,  f3_1_2 ],            [f1_2_2,  f2_2_2,  f3_2_2,  f4_2_2 ],
        ...                        ,            ...                                 ,
        [f1_1_N1, f2_1_N1, f3_1_N1]]            [f1_2_N2, f2_2_N2, f3_2_N2, f4_2_N2]]

我想将各种切片分配给arr1相应的切片arr2(索引和字段中的切片)。有关各种情况,请参见下文。

从我找到的答案(到相关但不完全相同的问题),在我看来,唯一的方法是一次分配一个切片,用于单个字段,即类似

arr2['f1'][0:1] = arr1['f1'][0:1]

(我可以确认这是有效的),循环切片中的所有源字段。

有没有办法一次分配切片中的所有预期源字段?


我的意思是分配x图像中的元素

案例 1(仅 中的部分字段arr1

arr1 = [[  x   ,    x   ,  f3_1_1 ],    arr2 = [[  x   ,    x   ,  f3_2_1,  f4_2_1 ],
        [  x   ,    x   ,  f3_1_2 ],            [  x   ,    x   ,  f3_2_2,  f4_2_2 ],
        ...                        ,            ...                                 ,
        [f1_1_N1, f2_1_N1, f3_1_N1]]            [f1_2_N2, f2_2_N2, f3_2_N2, f4_2_N2]]

案例 2(中的所有字段arr1

arr1 = [[  x   ,    x   ,    x    ],    arr2 = [[  x   ,    x   ,    x   ,  f4_2_1 ],
        [  x   ,    x   ,    x    ],            [  x   ,    x   ,    x   ,  f4_2_2 ],
        ...                        ,            ...                                 ,
        [f1_1_N1, f2_1_N1, f3_1_N1]]            [f1_2_N2, f2_2_N2, f3_2_N2, f4_2_N2]]

案例 3
arr1有字段['f1','f2','f3','f5']
arr2有字段['f1','f2','f3','f4']
分配一片['f1','f2','f3']


资料来源:

Python Numpy结构化数组(recarray)将值分配到切片中

在 NumPy 1.14 中将结构化数组的切片转换为常规 NumPy 数组

标签: arraysnumpyslicestructured-array

解决方案


例如,您可以这样做:

import numpy as np

x = np.array([('Rex', 9, 81.0), ('Fido', 3, 27.0)], dtype=[('name', 'U10'), ('age', 'i4'), ('weight', 'f4')])
y = np.array([('Carl', 10, 75.0), ('Joe', 7, 76.0)], dtype=[('name2', 'U10'), ('age2', 'i4'), ('weight', 'f4')])

print(x[['name', 'age']])
print(y[['name2', 'age2']])

# multiple field indexing
y[['name2', 'age2']] = x[['name', 'age']]

print(y[['name2', 'age2']])

# you can also use slicing if you want specific parts or the size does not match
y[:1][['name2', 'age2']] = x[1:][['name', 'age']]

print(y[:][['name2', 'age2']])

名称字段名称可以不同,我不确定 dtypes 以及是否存在(向下)转换。

https://docs.scipy.org/doc/numpy/user/basics.rec.html#assignment-from-other-structured-arrays

https://docs.scipy.org/doc/numpy/user/basics.rec.html#accessing-multiple-fields


推荐阅读