简体   繁体   中英

numpy structured array inconsistency

I'm writing a library that uses NumPy arrays and I have a scalar operation I would like to perform on any dtype. This works fine for most structured arrays, however I run into a problem when creating structured arrays with multiple dimensions for structured elements. As an example,

x = np.zeros(10, np.dtype('3float32,int8'))
print(x.dtype)
print(x.shape)

shows

[('f0', '<f4', (3,)), ('f1', 'i1')]
(10,)

but

x = np.zeros(10, np.dtype('3float32'))
print(x.dtype)
print(x.shape)

yields

float32
(10, 3)

that is, creating a structured array with a single multidimensional field appears to instead expand the array shape. This means that the number of dimensions for the last example is 2, not 1 as I was expecting. Is there anything I'm missing here, or a known workaround?

Use the same dtype notation as displayed in the first working example:

In [92]: x = np.zeros(3, np.dtype([('f0','<f4',(3,))]))

In [93]: x
Out[93]: 
array([([0., 0., 0.],), ([0., 0., 0.],), ([0., 0., 0.],)],
      dtype=[('f0', '<f4', (3,))])

I don't normally use the string shorthand,

In [99]: np.dtype('3float32')
Out[99]: dtype(('<f4', (3,)))     # no field name assigned

In [100]: np.zeros(3,_)
Out[100]: 
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]], dtype=float32)

A couple of comma separated strings creates named fields:

In [102]: np.dtype('3float32,i4')
Out[102]: dtype([('f0', '<f4', (3,)), ('f1', '<i4')])

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM