我有一个 numpy 结构化数组a
并在其上创建一个视图b
:
import numpy as np
a = np.zeros(3, dtype={'names':['A','B','C'], 'formats':['int','int','float']})
b = a[['A', 'C']]
descr
数据类型的组件表示b
数据以某种方式“分散”存储。
>>> b.dtype.descr
[('A', '<i4'), ('', '|V4'), ('C', '<f8')]
(阅读文档后,我认为该组件('', '|V4')
表示数据中存在“差距”,这b
只是对 . 的看法a
。)
如果这让我感到困扰,我可以复制数据:
import numpy.lib.recfunctions as rf
c = rf.repack_fields(b)
和
>>> c.dtype.descr
[('A', '<i4'), ('C', '<f8')]
如预期的。
这一步需要我复制数据。现在有时,我想对视图应用一个操作。通常,这些操作无论如何都会返回数组的副本。例如,
d = np.concatenate((b,b))
b
返回和中数据的副本a
。尽管如此,
>>> d.dtype.descr
[('A', '<i4'), ('', '|V4'), ('C', '<f8')]
表示数据没有被有效地存储。
那么有没有办法在不产生“分散”结果的情况下处理视图?我总是必须事先创建一个副本吗?还是没有效率问题,只是以一种奇怪的方式descr
描述数据类型?(如果是这样,我怎样才能避免这种情况?)
如果我想忽略中间步骤,这个问题就变得特别重要:
d = np.concatenate((a[['A', 'C']], a[['A', 'C']]))
我正在使用 numpy 1.16 和 python 3.7。