Numpy 配列操作
Numpy には配列を処理する関数がいくつか含まれており、おおまかに次のように分類できます:
配列の形状を変更
| 関数 | 説明 |
|---|---|
reshape |
データを変更せずに形状を変更する |
flat |
配列要素のイテレータ |
flatten |
配列のコピーを返し、コピーへの変更は元の配列に影響しない |
ravel |
フラット化した配列を返す |
numpy.reshape
numpy.reshape 関数は、データを変更せずに形状を変更できます。形式は次のとおりです:
numpy.reshape(arr, newshape, order='C')
arr:形状を変更する配列newshape:整数または整数の配列。新しい形状は元の形状と互換性がある必要があります- order:'C' -- 行方向、'F' -- 列方向、'A' -- 元の順序、'k' -- メモリ内での要素の出現順序。
例
出力結果は次のとおりです:
原始数组: [0 1 2 3 4 5 6 7] 修改后的数组: [[0 1] [2 3] [4 5] [6 7]]
numpy.ndarray.flat
numpy.ndarray.flat は配列要素のイテレータです。例は次のとおりです:
例
出力結果は次のとおりです:
原始数组: [0 1 2] [3 4 5] [6 7 8] 迭代后的数组: 0 1 2 3 4 5 6 7 8
numpy.ndarray.flatten
numpy.ndarray.flatten は配列のコピーを返し、コピーへの変更は元の配列に影響しません。形式は次のとおりです:
ndarray.flatten(order='C')
引数の説明:
- order:'C' -- 行方向、'F' -- 列方向、'A' -- 元の順序、'K' -- メモリ内での要素の出現順序。
例
出力結果は次のとおりです:
原数组: [[0 1 2 3] [4 5 6 7]] 展开的数组: [0 1 2 3 4 5 6 7] 以 F 风格顺序展开的数组: [0 4 1 5 2 6 3 7]
numpy.ravel
numpy.ravel() は配列要素をフラット化します。順序は通常「Cスタイル」で、返されるのは配列のビュー(view で、C/C++ の参照(reference)に少し似た意味です)です。変更は元の配列に影響します。
この関数は2つの引数を受け取ります:
numpy.ravel(a, order='C')
引数の説明:
- order:'C' -- 行方向、'F' -- 列方向、'A' -- 元の順序、'K' -- メモリ内での要素の出現順序。
例
出力結果は次のとおりです:
原数组: [[0 1 2 3] [4 5 6 7]] 调用 ravel 函数之后: [0 1 2 3 4 5 6 7] 以 F 风格顺序调用 ravel 函数之后: [0 4 1 5 2 6 3 7]
配列の転置
| 関数 | 説明 |
|---|---|
transpose |
配列の次元を入れ替える |
ndarray.T |
とself.transpose()同じ |
rollaxis |
指定した軸を後方にロールする |
swapaxes |
配列の2つの軸を入れ替える |
numpy.transpose
numpy.transpose 関数は配列の次元を入れ替えるために使用します。形式は次のとおりです:
numpy.transpose(arr, axes)
引数の説明:
arr:操作する配列axes:整数のリストで、次元に対応します。通常はすべての次元が入れ替えられます。
例
出力結果は次のとおりです:
原数组: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] 对换数组: [[ 0 4 8] [ 1 5 9] [ 2 6 10] [ 3 7 11]]
numpy.ndarray.T は numpy.transpose と似ています:
例
出力結果は次のとおりです:
原数组: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] 转置数组: [[ 0 4 8] [ 1 5 9] [ 2 6 10] [ 3 7 11]]
numpy.rollaxis
numpy.rollaxis 関数は、指定した軸を後方の特定の位置までロールします。形式は次のとおりです:
numpy.rollaxis(arr, axis, start)
引数の説明:
arr:配列axis:後方にロールする軸。他の軸の相対位置は変わりません。start:デフォルトは0で、完全なロールを意味します。特定の位置にロールされます。
例
出力結果は次のとおりです:
原数组: [[[0 1] [2 3]] [[4 5] [6 7]]] 获取数组中一个值: (array([1]), array([1]), array([0])) 6 调用 rollaxis 函数: [[[0 2] [4 6]] [[1 3] [5 7]]] (array([0]), array([1]), array([1])) 调用 rollaxis 函数: [[[0 2] [1 3]] [[4 6] [5 7]]] (array([1]), array([0]), array([1]))
numpy.swapaxes
numpy.swapaxes 関数は配列の2つの軸を交換するために使用します。形式は次のとおりです:
numpy.swapaxes(arr, axis1, axis2)
arr:入力配列axis1:最初の軸に対応する整数axis2:2番目の軸に対応する整数
例
出力結果は次のとおりです:
原数组: [[[0 1] [2 3]] [[4 5] [6 7]]] 调用 swapaxes 函数后的数组: [[[0 4] [2 6]] [[1 5] [3 7]]]
配列の次元を変更
| 次元 | 説明 |
|---|---|
broadcast |
ブロードキャストを模倣するオブジェクトを生成する |
broadcast_to |
配列を新しい形状にブロードキャストする |
expand_dims |
配列の形状を拡張する |
squeeze |
配列の形状から大きさ1の次元を削除する |
numpy.broadcast
numpy.broadcast は、ブロードキャストを模倣するオブジェクトを生成するために使用されます。ある配列を別の配列にブロードキャストした結果をカプセル化したオブジェクトを返します。
この関数は2つの配列を入力引数として受け取ります。例は次のとおりです:
例
出力結果:
对 y 广播 x: 1 4 1 5 广播对象的形状: (3, 3) 手动使用 broadcast 将 x 与 y 相加: (3, 3) 调用 flat 函数: [[5. 6. 7.] [6. 7. 8.] [7. 8. 9.]] x 与 y 的和: [[5 6 7] [6 7 8] [7 8 9]]
numpy.broadcast_to
numpy.broadcast_to 関数は、配列を新しい形状にブロードキャストします。元の配列の読み取り専用ビューを返します。通常は連続ではありません。新しい形状が NumPy のブロードキャスト規則に適合しない場合、この関数は ValueError をスローすることがあります。
numpy.broadcast_to(array, shape, subok)
例
出力結果:
原数组: [[0 1 2 3]] 调用 broadcast_to 函数之后: [[0 1 2 3] [0 1 2 3] [0 1 2 3] [0 1 2 3]]
numpy.expand_dims
numpy.expand_dims 関数は、指定した位置に新しい軸を挿入して配列の形状を拡張します。関数の形式は次のとおりです:
numpy.expand_dims(arr, axis)
引数の説明:
arr:入力配列axis:新しい軸を挿入する位置
例
出力結果は次のとおりです。
数组 x: [[1 2] [3 4]] 数组 y: [[[1 2] [3 4]]] 数组 x 和 y 的形状: (2, 2) (1, 2, 2) 在位置 1 插入轴之后的数组 y: [[[1 2]] [[3 4]]] x.ndim 和 y.ndim: 2 3 x.shape 和 y.shape: (2, 2) (2, 1, 2)
numpy.squeeze
numpy.squeeze 関数は、指定された配列の形状から1次元のエントリを削除します。関数の形式は次のとおりです。
numpy.squeeze(arr, axis)
パラメータの説明:
arr: 入力配列axis: 形状内の1次元エントリのサブセットを選択するための整数または整数タプル
例
出力結果は次のとおりです。
数组 x: [[[0 1 2] [3 4 5] [6 7 8]]] 数组 y: [[0 1 2] [3 4 5] [6 7 8]] 数组 x 和 y 的形状: (1, 3, 3) (3, 3)
配列の結合
| 関数 | 説明 |
|---|---|
concatenate |
既存の軸に沿って配列のシーケンスを連結する |
stack |
新しい軸に沿って一連の配列を追加する。 |
hstack |
シーケンス内の配列を水平方向(列方向)にスタックする |
vstack |
シーケンス内の配列を垂直方向(行方向)にスタックする |
numpy.concatenate
numpy.concatenate 関数は、指定された軸に沿って同じ形状の2つ以上の配列を連結するために使用されます。形式は次のとおりです。
numpy.concatenate((a1, a2, ...), axis)
パラメータの説明:
a1, a2, ...: 同じ型の配列axis: 配列を連結する軸。デフォルトは 0
例
出力結果は次のとおりです。
第一个数组: [[1 2] [3 4]] 第二个数组: [[5 6] [7 8]] 沿轴 0 连接两个数组: [[1 2] [3 4] [5 6] [7 8]] 沿轴 1 连接两个数组: [[1 2 5 6] [3 4 7 8]]
numpy.stack
numpy.stack 関数は、新しい軸に沿って配列のシーケンスを連結するために使用されます。形式は次のとおりです。
numpy.stack(arrays, axis)
パラメータの説明:
arrays同じ形状の配列のシーケンスaxis: 結果の配列内の軸。入力配列はこの軸に沿ってスタックされます
例
出力結果は次のとおりです。
第一个数组: [[1 2] [3 4]] 第二个数组: [[5 6] [7 8]] 沿轴 0 堆叠两个数组: [[[1 2] [3 4]] [[5 6] [7 8]]] 沿轴 1 堆叠两个数组: [[[1 2] [5 6]] [[3 4] [7 8]]]
numpy.hstack
numpy.hstack は numpy.concatenate の便利なラッパーであり、2番目の軸(axis=1)に沿って配列を水平にスタックします。
numpy.hstack は1次元配列を列ベクトルと見なして連結します。これは numpy.concatenate([numpy.atleast_1d(arr) for arr in arrays], axis=1) と同等です(すべての配列の次元が ≥2 の場合、axis=1 に沿って直接連結します)。
例
出力結果は次のとおりです。
第一个数组: [[1 2] [3 4]] 第二个数组: [[5 6] [7 8]] 水平堆叠: [[1 2 5 6] [3 4 7 8]]
numpy.vstack
numpy.vstack は numpy.concatenate の便利なラッパーであり、1番目の軸(axis=0)に沿って配列を垂直にスタックします。
numpy.vstack は1次元配列を自動的に2次元の行ベクトルに昇格させてから垂直方向に連結します。これは numpy.concatenate([numpy.atleast_2d(arr) for arr in arrays], axis=0) と同等です。
例
出力結果は次のとおりです。
第一个数组: [[1 2] [3 4]] 第二个数组: [[5 6] [7 8]] 竖直堆叠: [[1 2] [3 4] [5 6] [7 8]]
配列の分割
| 関数 | 配列と操作 |
|---|---|
split |
1つの配列を複数の部分配列に分割する |
hsplit |
1つの配列を水平方向(列方向)に複数の部分配列に分割する |
vsplit |
1つの配列を垂直方向(行方向)に複数の部分配列に分割する |
numpy.split
numpy.split 関数は、特定の軸に沿って配列を部分配列に分割します。形式は次のとおりです。
numpy.split(ary, indices_or_sections, axis)
パラメータの説明:
ary: 分割される配列indices_or_sections: 整数の場合、その数で均等に分割します。配列の場合、軸に沿った分割位置です(左開右閉)。axis: 分割する方向を設定します。デフォルトは 0 で、横方向(水平方向)に分割します。1 の場合は縦方向(垂直方向)に分割します。
例
出力結果は次のとおりです。
第一个数组: [0 1 2 3 4 5 6 7 8] 将数组分为三个大小相等的子数组: [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])] 将数组在一维数组中表明的位置分割: [array([0, 1, 2, 3]), array([4, 5, 6]), array([7, 8])]
axis が 0 の場合は水平方向に分割し、axis が 1 の場合は垂直方向に分割します:
例
a = np.arange(16).reshape(4, 4)
print('1つ目の配列:')
print(a)
print('\n')
print('デフォルト分割(0軸):')
b = np.split(a,2)
print(b)
print('\n')
print('水平方向に分割:')
c = np.split(a,2,1)
print(c)
print('\n')
print('水平方向に分割:')
d= np.hsplit(a,2)
print(d)
出力結果は次のとおりです。
第一个数组:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
默认分割(0轴):
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]
沿水平方向分割:
[array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]]), array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])]
沿水平方向分割:
[array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]]), array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])]
numpy.hsplit
numpy.hsplit 関数は配列を水平方向に分割するために使用され、返す同じ形状の配列の数を指定して元の配列を分割します。
例
出力結果は次のとおりです。
原array:
[[4. 7. 6. 3. 2. 6.]
[6. 3. 6. 7. 9. 7.]]
拆分后:
[array([[4., 7.],
[6., 3.]]), array([[6., 3.],
[6., 7.]]), array([[2., 6.],
[9., 7.]])]
numpy.vsplit
numpy.vsplit は垂直軸に沿って分割します。分割方法は hsplit と同じです。
例
出力結果は次のとおりです。
第一个数组:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
竖直分割:
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]
配列要素の追加と削除
| 関数 | 要素と説明 |
|---|---|
resize |
指定された形状の新しい配列を返す |
append |
配列の末尾に値を追加する |
insert |
指定された軸に沿って、指定されたインデックスの前に値を挿入する |
delete |
ある軸の部分配列を削除し、削除後の新しい配列を返す |
unique |
配列内の一意の要素を検索する |
numpy.resize
numpy.resize 関数は、指定されたサイズの新しい配列を返します。
新しい配列のサイズが元のサイズより大きい場合、元の配列の要素のコピーが含まれます。
numpy.resize(arr, shape)
パラメータの説明:
arr: サイズを変更する配列shape: 返される配列の新しい形状
例
出力結果は次のとおりです。
第一个数组: [[1 2 3] [4 5 6]] 第一个数组的形状: (2, 3) 第二个数组: [[1 2] [3 4] [5 6]] 第二个数组的形状: (3, 2) 修改第二个数组的大小: [[1 2 3] [4 5 6] [1 2 3]]
numpy.append
numpy.append 関数は、配列の末尾に値を追加します。追加操作は配列全体を割り当て、元の配列を新しい配列にコピーします。さらに、入力配列の次元は一致している必要があります。一致しない場合は ValueError が発生します。
append 関数が返すのは常に1次元配列です。
numpy.append(arr, values, axis=None)
パラメータの説明:
arr: 入力配列values: 対象のarrに追加する値。次のものと形状が同じである必要がありますarr形状が同じ(追加する軸を除く)axis: デフォルトは None です。axis が未定義の場合、横方向に追加され、戻り値は常に1次元配列です。axis が定義されている場合、それぞれ 0 と 1 の場合です。axis が定義されている場合、それぞれ 0 と 1 の場合です(列数を同じにする必要があります)。axis が 1 の場合、配列は右側に追加されます(行数を同じにする必要があります)。
例
出力結果は次のとおりです。
第一个数组: [[1 2 3] [4 5 6]] 向数组添加元素: [1 2 3 4 5 6 7 8 9] 沿轴 0 添加元素: [[1 2 3] [4 5 6] [7 8 9]] 沿轴 1 添加元素: [[1 2 3 5 5 5] [4 5 6 7 8 9]]
numpy.insert
numpy.insert 関数は、指定されたインデックスの前に、指定された軸に沿って入力配列に値を挿入します。
この関数は、指定された位置(または位置の配列)に指定された値または配列を挿入し、新しい配列を返します。挿入される要素はスカラー値でも配列でもかまいません。挿入操作は新しい配列を返し、元の配列は変更されないことに注意してください。
numpy.insert(arr, obj, values, axis)
パラメータの説明:
arr: 入力配列obj: 値を挿入する前のインデックスvalues: 挿入する値axis: 挿入する軸。指定されない場合、入力配列は平坦化されます
例
出力結果は次のとおりです。
第一个数组: [[1 2] [3 4] [5 6]] 未传递 Axis 参数。 在删除之前输入数组会被展开。 [ 1 2 3 11 12 4 5 6] 传递了 Axis 参数。 会广播值数组来配输入数组。 沿轴 0 广播: [[ 1 2] [11 11] [ 3 4] [ 5 6]] 沿轴 1 广播: [[ 1 11 2] [ 3 11 4] [ 5 11 6]]
numpy.delete
numpy.delete 関数は、入力配列から指定された部分配列を削除した新しい配列を返します。insert() 関数の場合と同様に、軸パラメータが指定されない場合、入力配列は平坦化されます。
Numpy.delete(arr, obj, axis)
パラメータの説明:
arr: 入力配列obj: スライス、整数、または整数配列を指定でき、入力配列から削除する部分配列を示しますaxis: 指定された部分配列を削除する軸。指定されない場合、入力配列は平坦化されます
例
出力結果は次のとおりです。
第一个数组: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] 未传递 Axis 参数。 在插入之前输入数组会被展开。 [ 0 1 2 3 4 6 7 8 9 10 11] 删除第二列: [[ 0 2 3] [ 4 6 7] [ 8 10 11]] 包含从数组中删除的替代值的切片: [ 2 4 6 8 10]
numpy.unique
numpy.unique 関数は、配列内の重複した要素を取り除くために使用されます。
numpy.unique(arr, return_index, return_inverse, return_counts)
arr: 入力配列。1次元配列でない場合は平坦化されますreturn_index: もしtrue、新しいリストの要素が古いリスト内の位置(インデックス)を返し、リスト形式で格納return_inverse: もしtrue、旧リストの要素が新リスト内の位置(インデックス)を返し、リスト形式で格納します。return_counts:である場合true、重複排除された配列の要素が元の配列に出現する回数を返します。
例
出力結果は:
第一个数组: [5 2 6 2 7 5 6 8 2 9] 第一个数组的去重值: [2 5 6 7 8 9] 去重数组的索引数组: [1 0 2 4 7 9] 我们可以看到每个和原数组下标对应的数值: [5 2 6 2 7 5 6 8 2 9] 去重数组的下标: [2 5 6 7 8 9] 下标为: [1 0 2 0 3 1 2 4 0 5] 使用下标重构原数组: [5 2 6 2 7 5 6 8 2 9] 返回去重元素的重复数量: [2 5 6 7 8 9] [3 2 2 1 1 1]その他の拡張