Pythonを一から勉強してデータ分析できるようになる

~ Pythonとデータ分析のお勉強の記録 ~

NumPyの基本:配列の変形(reshape, resize)

[Take1] 配列の変形(1) reshape()

 

【書式】

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)
in ()
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」は、要素数がオリジナルから変わるためにエラーになる。

 

[Take2] 配列の変形(2) resize()

 

【書式】

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」は、要素数がオリジナルより多くなり、その分、最初に戻ってから再配置していく感じ。