Numpyでreshapeを簡単に使う方法

Numpyのメソッドであるreshapeを、簡単に使ってみたいと思います。

reshapeメソッドとは、
Numpyで扱う高次元配列のカタチを変形できるメソッドです。

reshapeを使う際の注意点など細かくあります。
詳細は下記を参考して下さい。

https://note.nkmk.me/python-numpy-reshape-usage/
https://www.sejuku.net/blog/69254#npreshape

難しいことは横においておいて、
とにかく、簡単に、reshapeを使って、感覚を掴んでみたいと思います。

まずは、データを用意します。

# numpyをimport
import numpy as np

# データを作成
a = np.arange(24)
print(a)
print(a.shape)

#データ内容
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
#データのカタチ
(24,)

reshapeを使って配列のカタチを変形します。
下記のように、4×6の配列に変形しました。

b = np.reshape(a, (4,6))
print(b)
print(b.shape)

#データ内容
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
#データのカタチ
(4, 6)

続いて、上記で変形したbを、再度変形します。
現状の配列のカタチを気にせず、新しいカタチを作ることが出来ました。

c = np.reshape(b, (3, 8))
print(c)
print(c.shape)

#データ内容
[[ 0 1 2 3 4 5 6 7]
[ 8 9 10 11 12 13 14 15]
[16 17 18 19 20 21 22 23]]
#データのカタチ
(3, 8)

更に、上記で変形したbを、再度変形します。
次元を1つ増やした配列が出来ました。

d = np.reshape(c, (3, 4, 2))
print(d)
print(d.shape)

#データ内容
[[[ 0 1] [ 2 3] [ 4 5] [ 6 7]]
[[ 8 9] [10 11] [12 13] [14 15]]
[[16 17] [18 19] [20 21] [22 23]]]
#データのカタチ
(3, 4, 2)

Arduino × MCP23017_連携方法

MCP23017
http://ww1.microchip.com/downloads/jp/DeviceDoc/20001952C_JP.pdf

初期設定 参考サイト
https://www.petitmonte.com/robot/howto_io_expander.html

ARUDINO MCP23017 ハードウェア接続方法

・デバイスアドレスを指定 (A0, A1, A2 のPINで指定)
※デバイスアドレスはArduinoからMCP23017へ指令する際に指定するアドレス 
A0, A1, A2 のPINに対して 「High ⇒ 1  Low ⇒ 0」 で指定
計算方法は、 2 (2乗) * A2 + 2 (1乗) * A1 + 2 (0乗) * A016進数で 0x20 ~ 0x27 の8通りのデバイスアドレスを指定することが可能(8つの、MCP23017 を接続することが可能)

・VDD, VSSで電源を供給
グラウンド、電位
https://blogs.yahoo.co.jp/denshiyorimichi/33243395.html

・SCL、SDAを接続
https://novicengineering.com/i2c%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/
SCL:SDA:

Arduino R2 の場合
Uno: SDA=A4 SCL=A5
※Arduinoの世代によって接続するPINが異なるので注意
https://trac.switch-science.com/wiki/Arduino-diffhttp://www.musashinodenpa.com/arduino/ref/index.php?f=1&pos=342

ARUDINO MCP23017 ハードウェア接続方法 ※スケッチ作成

・ライブラリ Wire.h をinclude
#include <Wire.h>

・デバイスアドレスを指定
A0, A1, A2 で指定したデバイスアドレス0x20 ~ 0x27 の8通りのデバイスアドレスを指定することが可能uint8_t DEVICE_ADDRESS = 0x20; 

・初期設定
setup()内で、決まったお作法をしてデバイスアドレスを指定した MCP23017 と接続

void setup() {// マスタとしてI2Cバスに接続する  
Wire.begin();  // 初期設定(IODIRA/IODIRB)  Wire.beginTransmission(DEVICE_ADDRESS);  // 先頭アドレスへ  
Wire.write(0x00);  // I/O設定Aの全てを出力設定にする 
Wire.write(0x00);  // I/O設定Bの全てを出力設定にする  
Wire.write(0x00);  Wire.endTransmission();// GPIOA(GPA0~GPA7)  
Wire.beginTransmission(DEVICE_ADDRESS);  

Wire.write(0x12);  // 全てのGPAピンをHIGH(出力)にする  
Wire.write(0xff);  Wire.endTransmission(); // GPIOB(GPB0~GPB7)  
Wire.beginTransmission(DEVICE_ADDRESS);  
Wire.write(0x13);  //  GPB0をLOW(入力)でそれ以外のGPBピンはHIGH(出力)にする  
Wire.write(0xfe); // 2進 11111110  
Wire.endTransmission();}

・GPIOA GPIOB の各ピンへの指令方法

// デバイスアドレスを指定     
 Wire.beginTransmission(DEVICE_ADDRESS);
 // GPIOA or GPIOB を指定(右側の0 ~ 7 / 左側の0 ~ 7 どちらを操作)      
Wire.write(0x13);
// 0 ~ 7 のどのPINをHIGH・LOWに指定するかを「0 , 1」で指定      
Wire.write(0b11111111); // 2進 11111111
// データ転送      
Wire.endTransmission();