【書式】
numpy.reshape(配列, 変形したい配列の形状)
★要素数の変更不可
【コード】
import numpy as np
# 乱数の固定
np.random.seed(0)
# 元配列作成
arr1=np.random.randint(1,10,(2,3,4))
print("変形前\n",arr1)
print("\n\n")
# 複数の変形パターンで変形
arr2=np.reshape(arr1,(2,12))
print("変形後1(2,12)\n",arr2,"\n")
arr3=np.reshape(arr1,(3,8))
print("変形後2(3,8)\n",arr3,"\n")
arr4=np.reshape(arr1,(4,6))
print("変形後3(4,6)\n",arr4,"\n")
arr5=np.reshape(arr1,(6,4))
print("変形後4(6,4)\n",arr5,"\n")
arr6=np.reshape(arr1,(8,3))
print("変形後5(8,3)\n",arr6,"\n")
arr7=np.reshape(arr1,(12,2))
print("変形後6(12,2)\n",arr7,"\n")
arr8=np.reshape(arr1,(12,3))
print("変形後7(12,3)\n",arr8)
【結果】
変形前
[[[6 1 4 4]
[8 4 6 3]
[5 8 7 9]]
[[9 2 7 8]
[8 9 2 6]
[9 5 4 1]]]
変形後1(2,12)
[[6 1 4 4 8 4 6 3 5 8 7 9]
[9 2 7 8 8 9 2 6 9 5 4 1]]
変形後2(3,8)
[[6 1 4 4 8 4 6 3]
[5 8 7 9 9 2 7 8]
[8 9 2 6 9 5 4 1]]
変形後3(4,6)
[[6 1 4 4 8 4]
[6 3 5 8 7 9]
[9 2 7 8 8 9]
[2 6 9 5 4 1]]
変形後4(6,4)
[[6 1 4 4]
[8 4 6 3]
[5 8 7 9]
[9 2 7 8]
[8 9 2 6]
[9 5 4 1]]
変形後5(8,3)
[[6 1 4]
[4 8 4]
[6 3 5]
[8 7 9]
[9 2 7]
[8 8 9]
[2 6 9]
[5 4 1]]
変形後6(12,2)
[[6 1]
[4 4]
[8 4]
[6 3]
[5 8]
[7 9]
[9 2]
[7 8]
[8 9]
[2 6]
[9 5]
[4 1]]
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
28 print("変形後6(12,2)\n",arr7,"\n")
29
---> 30 arr8=np.reshape(arr1,(12,3))
31 print("変形後7(12,3)\n",arr8)
1 frames
/usr/local/lib/python3.10/dist-packages/numpy/core/fromnumeric.py in _wrapfunc(obj, method, *args, **kwds)
57
58 try:
---> 59 return bound(*args, **kwds)
60 except TypeError:
61 # A TypeError occurs if the object does have such a method in its
ValueError: cannot reshape array of size 24 into shape (12,3)
元配列を平坦化した後に、変換後列数毎に区切っていく感じ。
最後の「変換後7」は、要素数がオリジナルから変わるためにエラーになる。
【書式】
umpy.resize(配列, 変形したい配列の形状)
★要素数が変わっても動作する(切り捨てや、再表示)
【コード】
import numpy as np
# 乱数の固定
np.random.seed(0)
# 元配列作成
arr1=np.random.randint(1,10,(2,3,4))
print("変形前\n",arr1)
print("\n\n")
# 複数の変形パターンで変形
arr2=np.resize(arr1,(2,12))
print("変形後1(2,12)\n",arr2,"\n")
arr3=np.resize(arr1,(3,8))
print("変形後2(3,8)\n",arr3,"\n")
arr4=np.resize(arr1,(4,6))
print("変形後3(4,6)\n",arr4,"\n")
arr5=np.resize(arr1,(6,4))
print("変形後4(6,4)\n",arr5,"\n")
arr6=np.resize(arr1,(8,3))
print("変形後5(8,3)\n",arr6,"\n")
arr7=np.resize(arr1,(12,2))
print("変形後6(12,2)\n",arr7,"\n")
arr8=np.resize(arr1,(12,3))
print("変形後7(12,3)\n",arr8)
【結果】
変形前
[[[6 1 4 4]
[8 4 6 3]
[5 8 7 9]]
[[9 2 7 8]
[8 9 2 6]
[9 5 4 1]]]
変形後1(2,12)
[[6 1 4 4 8 4 6 3 5 8 7 9]
[9 2 7 8 8 9 2 6 9 5 4 1]]
変形後2(3,8)
[[6 1 4 4 8 4 6 3]
[5 8 7 9 9 2 7 8]
[8 9 2 6 9 5 4 1]]
変形後3(4,6)
[[6 1 4 4 8 4]
[6 3 5 8 7 9]
[9 2 7 8 8 9]
[2 6 9 5 4 1]]
変形後4(6,4)
[[6 1 4 4]
[8 4 6 3]
[5 8 7 9]
[9 2 7 8]
[8 9 2 6]
[9 5 4 1]]
変形後5(8,3)
[[6 1 4]
[4 8 4]
[6 3 5]
[8 7 9]
[9 2 7]
[8 8 9]
[2 6 9]
[5 4 1]]
変形後6(12,2)
[[6 1]
[4 4]
[8 4]
[6 3]
[5 8]
[7 9]
[9 2]
[7 8]
[8 9]
[2 6]
[9 5]
[4 1]]
変形後7(12,3)
[[6 1 4]
[4 8 4]
[6 3 5]
[8 7 9]
[9 2 7]
[8 8 9]
[2 6 9]
[5 4 1]
[6 1 4]
[4 8 4]
[6 3 5]
[8 7 9]]
基本的な動作はreshapeと同じく、元配列を平坦化した後に、変換後列数毎に区切っていく感じ。
最後の「変換後7」は、要素数がオリジナルより多くなり、その分、最初に戻ってから再配置していく感じ。