将dtype i4转换为dtype s4的问题

时间:2017-07-19 15:49:53

标签: python python-2.7 numpy

所以我有一个类型为i4的数组(10,3)。我希望将数据转换为3个不同的字符串数组,但我对数组的2d版本有问题。

import numpy
xyz = (100.0*numpy.random.random((10,3))).astype("i4")
A = xyz[:,0:3].view("S12") #works fine
B = xyz[:,0:2].view("S8") #fails
C = xyz[:,0:1].view("S4") #works fine

D = xyz[0,0:2].view("S8") #works fine using only 1 element instead of whole array

为什么我无法转换为一般形式:

xyz[:,0:dim].view("S%d"%(4*dim))

不管选择的暗淡?

2 个答案:

答案 0 :(得分:1)

numpy.array(xyz[:,0:2].tostring())

作品。

使用:2您正在查看2个数字(4个字节块),跳过1,查看下2个等等。这是视图,而不是副本,因为步幅和形状可以在不更改基础数据的情况下处理。

但是如果你试图在8字节块中查看相同的东西,strides就无法处理它。它需要查看1个块,跳过1/2块等等。

通过复制,这8个字节的块是连续的,可以看作一个单元。

{{1}}实际上是一个副本 - 将数据(只是{{1}}列)写入字节字符串,然后重新创建数组。

答案 1 :(得分:0)

所以我做了一些实验,看起来我找到了一贯有用的东西:

numpy.array(xyz[:,0:2].tostring()).view("10S8").reshape(10,1)

我没有超级使用它,因为它看起来很奇怪,但无论我猜想它都能正常工作。如果有人有更好的答案,请告诉我。