最新版本的numpy 1.16添加了structured_to_unstructured,它解决了这个问题:
from numpy.lib.recfunctions import structured_to_unstructured
y = structured_to_unstructured(x) # 2d array of 'S2'
z = y.astype(np.int8)
在以前的numpy版本中,您可以将x.data和np.frombuffer组合在一起,从内存中的相同数据创建另一个数组,而不必使用步幅.但它并没有带来性能提升,因为计算是由从S2到int8的转换驱动的.
n = 1000
def f1(x):
y = np.lib.stride_tricks.as_strided(x.view(dtype='S2'),
shape=(n, 3),
strides=(6, 2))
return y.astype(np.int8)
def f2(x):
y = np.frombuffer(x.data, dtype='S2').reshape((n, 3))
return y.astype(np.int8)
x = np.array([(i%3-1, (i+1)%3-1, (i+2)%3-1)
for i in xrange(n)],
dtype='S2,S2,S2')
z1 = f1(x)
z2 = f2(x)
assert (z1==z2).all()