问题
I have a created a numpy array, each element of the array contains an array of the same shape (9,5). What I want is a 3D array.
I've tried using np.stack.
data = list(map(lambda x: getKmers(x, 9), data)) # getKmers creates a
# list of list from a pandas dataframe
data1D = np.array(data) # shape (350,)
data2D = np.stack(data1D)
data1D:
array([list([ pdbID AtomNo Type Eta Theta
0 1a9l.pdb 2.0 G 169.225 212.838
1 1a9l.pdb 3.0 G 168.439 206.785
2 1a9l.pdb 4.0 U 170.892 205.845
3 1a9l.pdb 5.0 G 164.726 225.982
4 1a9l.pdb 6.0 A 308.788 144.370
5 1a9l.pdb 7.0 C 185.211 209.363
6 1a9l.pdb 8.0 U 167.612 216.614
7 1a9l.pdb 9.0 C 168.741 219.239
8 1a9l.pdb 10.0 C 163.639 207.044, pdbID AtomNo Type Eta Theta
1 1a9l.pdb 3.0 G 168.439 206.785
2 1a9l.pdb 4.0 U 170.892 205.845
3 1a9l.pdb 5.0 G 164.726 225.982
4 1a9l.pdb 6.0 A 308.788 144.370
5 1a9l.pdb 7.0 C 185.211 209.363
6 1a9l.pdb 8.0 U 167.612 216.614
7 1a9l.pdb 9.0 C 168.741 219.239
8 1a9l.pdb 10.0 C 163.639 207.044
I get this error: cannot copy sequence with size 9 to array axis with dimension 5
I want to create a 3D Matrix, where every subarray is in the new 3D dimension. I gues the new shape would be (9,5,350)
回答1:
You need to use
data.reshape((data.shape[0], data.shape[1], 1))
Example
from numpy import array
data = [[11, 22],
[33, 44],
[55, 66]]
data = array(data)
print(data.shape)
data = data.reshape((data.shape[0], data.shape[1], 1))
print(data.shape)
Running the example first prints the size of each dimension in the 2D array, reshapes the array, then summarizes the shape of the new 3D array.
Result
(3,2)
(3,2,1)
Source :https://machinelearningmastery.com/index-slice-reshape-numpy-arrays-machine-learning-python/
回答2:
If you want to create a 3D Matrix where every subarray is in the new 3D dimension, wouldn't the final shape be (350,9,5)? In that case, you can simply use:
new_array = np.asarray(data).reshape(350,9,5)
回答3:
It seems from your question that getKmers(x, 9) produces a list of 9 length-350 lists, and the data input has 5 elements. You want a (9, 5, 350) array out of this. This should be achievable with:
arr = np.swapaxes([getKermers(x, 9) for x in data], 0, 1)
Note that swapaxes is NOT the same as reshaping. If you were to just do np.array([getKermers(x, 9) for x in data]).reshape(9, 5, 350), you'd end up with the desired output shape but your data would be in the wrong order.
来源:https://stackoverflow.com/questions/56634634/convert-2d-array-to-3d-numpy-array