简体   繁体   中英

Change dtype of none square numpy ndarray

a = np.array([1,2,3])
b = np.array([1,2,3,4])
c = np.array([a, b])

c has two np.ndarrays inside of different size, when I try to call c.astype(np.int8) , I would get a value error of ValueError: setting an array element with a sequence. . How can I change dtype of c?

To specify the type of your array during the creation, simply use dtype=xxx . Ex:

c = np.array([a,b], dtype=object)

If you want to change the type from int64 to int8 , you could use:

a.dtype = np.int8
b.dtype = np.int8

Or you can copy a and b :

c = np.array(a, dtype=np.int8)
d = np.array(a, dtype=np.int8)

Finally, if you don't have access to a and b but only to c , here how you can do the same:

for arr in c:
    arr.dtype = np.int8

Maybe you could do something like this:

arr = list()

for row in range(len(df.desired_column)):
  arr.append(np.array(df.desired_column.loc[row], dtype=np.int8))

arr = np.array(arr)

This way every element of arr will be a numpy array with the desired dtype . On this example, np.int8 .

Assuming arr is a numpy array of dtype object containing numpy arrays, you could do:

arr8 = np.array([i.astype('int8') for i in arr])

Demo:

arr = array([array([0]), array([0, 1]), array([0, 1, 2]), array([0, 1, 2, 3]),
...        array([0, 1, 2, 3, 4]), array([0, 1, 2, 3, 4, 5]),
...        array([0, 1, 2, 3, 4, 5, 6]), array([0, 1, 2, 3, 4, 5, 6, 7])],
...       dtype=object)
print(arr)

array([array([0]), array([0, 1]), array([0, 1, 2]), array([0, 1, 2, 3]),
       array([0, 1, 2, 3, 4]), array([0, 1, 2, 3, 4, 5]),
       array([0, 1, 2, 3, 4, 5, 6]), array([0, 1, 2, 3, 4, 5, 6, 7])],
      dtype=object)

print(np.array([i.astype('int8') for i in arr]))

array([array([0], dtype=int8), array([0, 1], dtype=int8),
       array([0, 1, 2], dtype=int8), array([0, 1, 2, 3], dtype=int8),
       array([0, 1, 2, 3, 4], dtype=int8),
       array([0, 1, 2, 3, 4, 5], dtype=int8),
       array([0, 1, 2, 3, 4, 5, 6], dtype=int8),
       array([0, 1, 2, 3, 4, 5, 6, 7], dtype=int8)], dtype=object)

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