numpyの研究ノート(パートII)

numpyの研究ノート(パートII)


道は長く、幸せと地を来ています!numpyの研究ノート(パートI)

除算演算のnumpyのの合成配列

機械学習アルゴリズムを使用する際には、多くの場合、両方を使用します。

1、マージ操作

import numpy as np
x = np.array([1, 2, 3])
y = np.array([3, 2, 1])
z = np.array([666, 666, 666])
  • np.concatenate([、]、軸= ) デフォルトの軸= 0、スプライスは、新しいアレイに戻された後。これは、元の配列は変更されません。
np.concatenate([x, y])

実行出力:配列([1、2、3、3、2、1])

np.concatenate([x, y, z])

実行出力:配列([1、2、3、3、2、1、666、666、666])

上記2つの次元で見て、一次元アレイのモザイクです。

A = np.array([[1, 2, 3],
             [4, 5, 6]])    # A.shape=(2,3),从第一个维度上拼接就是(4,3)
np.concatenate([A, A])

出力を実行します。

array([[1, 2, 3],
       [4, 5, 6],
       [1, 2, 3],
       [4, 5, 6]])
np.concatenate([A, A], axis=1)      # 从第二个维度上拼接就是(2,6)

出力を実行します。

array([[1, 2, 3, 1, 2, 3],
       [4, 5, 6, 4, 5, 6]])

だから、Aおよびzは、一緒にスプライシングすることができますか?明らか次元配列zは1であり、Aは、2次元アレイの動作エラーではない、からです。z.shape =(3、)、我々は、最初の2次元アレイ、次いでステッチのためにインストール変形を動作させるために、この時間を使用することができます。

np.concatenate([A, z.reshape(1, -1)])

出力を実行します。

array([[  1,   2,   3],
       [  4,   5,   6],
       [666, 666, 666]])

実際には、優れたパッケージnumpyのは、異なる次元間の合併の問題を解決する機能を有しています。

  • np.vstack()
np.vstack([A, z])

出力を実行します。

array([[  1,   2,   3],
       [  4,   5,   6],
       [666, 666, 666]])
  • np.hstack()
B = np.full((2, 2), 100)
np.hstack([A, B])
array([[  1,   2,   3, 100, 100],
       [  4,   5,   6, 100, 100]])

2、分割操作

  • np.split(X、[、]、軸=)

    最初のパラメータは、2番目のパラメータは分割点で、セグメント化されたオブジェクトであり、分割点は一意でなくてもよいです。デフォルトは0軸であります

x = np.arange(10)
x

実行出力:配列([0、1、2、3、4、5、6、7、8、9])

np.split(x, [3, 7])

実行出力:[配列([0、1、2])、アレイ([3、4、5、6])、アレイ([7、8、9])]

また、以下の2次元配列をしてみてください。

A = np.arange(16).reshape(4, 4)
A

出力を実行します。

array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
np.split(A, [3])

出力を実行します。

[array([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]]), array([[12, 13, 14, 15]])]
np.split(A, [3], axis=1)

出力を実行します。

[array([[ 0,  1,  2],
        [ 4,  5,  6],
        [ 8,  9, 10],
        [12, 13, 14]]), array([[ 3],
        [ 7],
        [11],
        [15]])]

実際には、垂直方向と水平方向のステッチであっnumpyのために、それは垂直および水平分割を持っています。

  • np.vsplit()
np.vsplit(A, [3])

出力を実行します。

[array([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]]), array([[12, 13, 14, 15]])]
np.hsplit(A, [3])

出力を実行します。

[array([[ 0,  1,  2],
        [ 4,  5,  6],
        [ 8,  9, 10],
        [12, 13, 14]]), array([[ 3],
        [ 7],
        [11],
        [15]])]

実際にvsplitは、時間軸= 0を分割され、hsplitは時間軸= 1に分割されます。上記の比較を通じて見つけることができます!

それでは、少し短い回答演習を行う、今、データの次のセットがあり、データとして最初の3、およびラベル(最後の)がに変換されながら、最終的にはラベルのサンプルとして、この時点で我々は、離れてそれを分割する必要がありますベクトル:

アレイ([0、1、2、3]、
[4、5、6、7]、
[8、9、10、11]、
[12、13、14、15]])

data = np.arange(16).reshape(4, 4)
x, y = np.hsplit(data, [-1])

出力を実行します。

array([[ 0,  1,  2],
       [ 4,  5,  6],
       [ 8,  9, 10],
       [12, 13, 14]])
array([[ 3],
       [ 7],
       [11],
       [15]])

次はベクトル配列に変換する必要があります。

y[:, 0]

実行出力:配列([3、7、11、15])

二、numpyの行列演算

今、このような問題がある:ベクター与えられ、ベクトルの各要素は、図2に示すように、A =(0,1,2)で乗算されるように、* 2 =(0,2,4)

L = [i for i in range(10)]
L * 2

実行出力:[0、1、2、3、4、5、6、7、8、9、0、1、2、3、4、5、6、7、8、9]

これは明らかに私たちが望む結果ではありません。それでは、どのように達成したいですか?

A = []
for i in L:
    A.append(i * 2)
A

実行出力:[0、2、4、6、8、10、12、14、16、18]

これは、ここでの実装の速度を比較するために、いくつかのですが、確かに最善の方法ではありません。

%%time
L = [i for i in range(100000)]
A = []
for i in L:
    A.append(i * 2)
A

実行出力:ウォール時間:14.6ミリ

%%time
L = [i*2 for i in range(100000)]

実行出力:ウォール時間:6.83秒

%%time
import numpy as np
A = np.array(i*2 for i in range(100000000000000))
A
%%time
L = np.arange(10)
L * 2
L

実行出力:ウォール時間:0 NS

0それはなぜですか?実際には、以来、Aは関係なく同じであるどのくらいの数の後ろに、発電機を返しません。これは、大規模なデータ操作の利点でnumpyのです。ビルダー

import numpy as np
L = np.arange(10)
L * 2

実行出力:配列([0、2、4、6、8、10、12、14、16、18])

1、ユニバーサル機能

X = np.arange(1, 16).reshape(3, 5)
X

出力を実行します。

array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10],
       [11, 12, 13, 14, 15]])
  • 追加
X + 1

出力を実行します。

array([[ 2,  3,  4,  5,  6],
       [ 7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16]])
  • 引き算
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
  • 乗算
X * 2

出力を実行します。

array([[ 2,  4,  6,  8, 10],
       [12, 14, 16, 18, 20],
       [22, 24, 26, 28, 30]])
  • 除算
X / 2

出力を実行します。

array([[0.5, 1. , 1.5, 2. , 2.5],
       [3. , 3.5, 4. , 4.5, 5. ],
       [5.5, 6. , 6.5, 7. , 7.5]])
X // 2

出力を実行します。

array([[0, 1, 1, 2, 2],
       [3, 3, 4, 4, 5],
       [5, 6, 6, 7, 7]], dtype=int32)
  • 余り
X % 2

出力を実行します。

array([[1, 0, 1, 0, 1],
       [0, 1, 0, 1, 0],
       [1, 0, 1, 0, 1]], dtype=int32)
  • 相互リンク--1 / X
  • 絶対値--np.abs()
  • 正弦関数--np.sin()
  • コサイン関数--np.cos()
  • タンジェント関数--np.tan()
  • またように逆正弦、余弦、正接、およびがあります。
  • 指数関数--np.exp()
  • np.power()
  • np.log()
  • np.log2()
  • np.log10()

図2に示すように、行列演算

A = np.arange(4).reshape(2, 2)
B = np.full((2, 2), 10)
  • + B

  • AB

  • *のB

  • A / B

    上記の方法は、対応する操作の対応する要素であるので、あなたは、行列の乗算を実行する必要がある場合はどのように行うには?

  • 行列乗算--np.dot()

A.dot(B)

出力を実行します。

array([[10, 10],
       [50, 50]])
  • 行列の転置
A.T

出力を実行します。

array([[0, 2],
       [1, 3]])
  • --Np.linalg.inv逆行列()
np.linalg.inv(A)

出力を実行します。

array([[-1.5,  0.5],
       [ 1. ,  0. ]])
np.linalg.inv(A).dot(A)

出力を実行します。

array([[1., 0.],
       [0., 1.]])

[ - 1 ^] = Eこれはまた、A * Aを検証します

  • --Np.linalg.pinv擬似逆行列()

    多くの場合、我々は正方行列ではないかもしれないし、通常の状況下で、この時点で、我々は、逆行列を得ることができません。しかし、擬似逆行列を得ることができます。

C = np.arange(0, 16).reshape(2, 8)
C = np.arange(0, 16).reshape(2, 8)

出力を実行します。

array([[-1.35416667e-01,  5.20833333e-02],
       [-1.01190476e-01,  4.16666667e-02],
       [-6.69642857e-02,  3.12500000e-02],
       [-3.27380952e-02,  2.08333333e-02],
       [ 1.48809524e-03,  1.04166667e-02],
       [ 3.57142857e-02, -1.04083409e-17],
       [ 6.99404762e-02, -1.04166667e-02],
       [ 1.04166667e-01, -2.08333333e-02]])
C.dot(np.linalg.pinv(C))

出力を実行します。

array([[ 1.00000000e+00, -2.49800181e-16],
       [ 0.00000000e+00,  1.00000000e+00]])

上記の結果により求めることができる、近似マトリクスは擬似逆行列が決定される説明、近似。自分のBaiduのを解決するために、より具体的な擬似逆行列のために!

図3に示すように、ベクトル及び行列演算

A = np.arange(4).reshape(2, 2)
v = np.array([1, 2])
  • + A
v + A

出力を実行します。

array([[1, 3],
       [3, 5]])
np.vstack([v] * A.shape[0])

出力を実行します。

array([[1, 2],
       [1, 2]])
np.vstack([v] * A.shape[0]) + A

出力を実行します。

array([[1, 3],
       [3, 5]])

この場合、得られた2つの結果が見られる同じです。実際には、機能パッケージがすでにpyhon積み重ね

  • np.tile()
np.tile(v, (2, 1))

出力を実行します。

array([[1, 2],
       [1, 2]])
np.tile(v, (2, 1)) + A

出力を実行します。

array([[1, 3],
       [3, 5]])
  • *で
v * A

出力を実行します。

array([[0, 2],
       [2, 6]])
  • A.dot(V)
A.dot(v)

実行出力:配列([2,8])

  • v.dot(A)
v.dot(A)

実行出力:配列([4,7])

三、numpyの重合操作

import numpy as np
L = np.random.random(100)

出力を実行します。

array([0.21395159, 0.90268106, 0.88705369, 0.11517909, 0.62676208,
       0.56121013, 0.62103571, 0.2418181 , 0.13781453, 0.66670862,
       0.51939238, 0.99679432, 0.06384017, 0.5974129 , 0.22196488,
       0.93826983, 0.83706847, 0.63491905, 0.48828241, 0.85424059,
       0.86514318, 0.47937265, 0.34254143, 0.89577197, 0.14823176,
       0.94488872, 0.57030248, 0.57643624, 0.08268558, 0.8237711 ,
       0.21887705, 0.46440547, 0.9338367 , 0.132422  , 0.4867988 ,
       0.6545799 , 0.36226663, 0.01641314, 0.67876507, 0.35811434,
       0.36533195, 0.12174504, 0.37477359, 0.98791281, 0.20553232,
       0.65235494, 0.13567244, 0.92317556, 0.82237976, 0.62747037,
       0.41160535, 0.46839494, 0.06753446, 0.22386476, 0.20821765,
       0.11778734, 0.8643039 , 0.77497708, 0.9884161 , 0.65142779,
       0.2374325 , 0.32467954, 0.81959546, 0.9863651 , 0.54072234,
       0.21293241, 0.92733881, 0.98738362, 0.90565471, 0.23441948,
       0.05477787, 0.69157053, 0.49194796, 0.12415383, 0.55427813,
       0.29040539, 0.20166942, 0.30054924, 0.30772375, 0.90932004,
       0.84668024, 0.51970052, 0.67773186, 0.37401172, 0.43911304,
       0.98495573, 0.42493635, 0.83658015, 0.35920119, 0.91977698,
       0.95094167, 0.03354397, 0.92045222, 0.80083071, 0.03480189,
       0.22378161, 0.21437509, 0.33268728, 0.51601075, 0.61235958])
  • )(--np.sum合計します
sum(L)

出力を実行します。52.28029464862967

np.sum(L)

出力を実行します。52.28029464862967

したがって、これらの二つは同じものではないですか?実際には、それが純粋な効率に同じではありません。

  • 最小--np.min()
np.min(L)

出力を実行します。0.016413139615859218

  • 最大--np.max()
np.max(L)

出力を実行します。0.9967943174823842

次に、2次元配列をしてみてください。

X = np.arange(16).reshape(4, -1)
X

出力を実行します。

array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
np.sum(X)

実行出力:120

しかし、多くの時間が、我々はすべての合計をカウントする必要はありませんが、単にその各行、各列が必要ですか。

np.sum(X, axis=0)

実行出力:配列([24、28、32、36])

np.sum(X, axis=1)

実行出力:配列([6、22、38、54])

ここで、少しスキル、軸= 0行圧縮が実際に直接一列に圧縮行数に関係なく意味、出しているに言えば、それは軸= 1が実際に置かれ、各列の合計が一緒に、あります柱状圧縮うち、最終的な結果は、それぞれ数を行ことです。行と列の和の合計が、それは容易ではありません覚えているので。

  • 乗法--np.prod()
np.prod(X)

出力を実行します。0

np.prod(X + 1)

出力を実行します:2004189184

  • --np.mean平均()
np.mean(X)

実行出力:7.5

  • 中位数——np.median()
np.median(X)

実行出力:7.5

  • パーセンタイル--np.precentile()
X = np.arange(16).reshape(4, -1)
for percent in [0, 25, 50, 75, 100]:
    print(np.percentile(X, q=percent))

出力を実行します。

0.0
3.75
7.5
11.25
15.0
  • 分散--np.var()
np.var(X)

実行出力:21.25

  • --np.std標準偏差()
np.std(X)

出力を実行します。4.6097722286464435

四、numpyの操作引数

1、インデックス操作

  • ()np.argminのインデックス位置#の最小値
  • ()np.argmax最大#インデックス位置

2、ソートとインデックスの使用

# 首先生成一个乱序数组
import numpy as np
x = np.arange(16)
np.random.shuffle(x)
x

実行出力:配列([4、2、8、14、0、15、6、3、11、7、13、1、12、10、9、5])

  • np.sort(X軸=)デフォルト軸= 1
np.sort(x)

実行出力:配列([0、1、2、3、4、5、6、7、8、9、10、11、12、13、14、15])

あなたがX上で直接ソートする場合は、この時点では、何の変化xは存在しない、xは、まだ無秩序状態です。

x.sort()
x

実行出力:配列([0、1、2、3、4、5、6、7、8、9、10、11、12、13、14、15])

そして、それは2次元マトリックスのため?

X = np.random.randint(10, size=(4, 4))
X

出力を実行します。

array([[5, 3, 9, 2],
       [3, 7, 5, 7],
       [0, 6, 2, 0],
       [8, 7, 4, 8]])
np.sort(X, axis=0)

出力を実行します。

array([[0, 3, 2, 0],
       [3, 6, 4, 2],
       [5, 7, 5, 7],
       [8, 7, 9, 8]])
  • np.argsort()ソートされたインデックス位置
import numpy as np
x = np.arange(16)
np.random.shuffle(x)
np.argsort(x)

出力を実行します。

array([ 1, 15,  9,  0, 10,  8, 12, 13,  5,  4,  6,  2,  3, 14, 11,  7],
      dtype=int64)
  • np.partition()

    実際には、多くの場合、我々は降順でソートされ、すべてをカウントする必要はありませんが、左側の中央値よりも小さい中間値を、見つけるために、右に中央値よりも大きくなります。

np.partition(x, 3)

実行出力:配列([0、1、2、3、9、8、10、12、5、11、4、14、6、7、13、15])

  • np.argpartition()
np.argpartition(x, 3)

出力を実行します。

array([ 1, 15,  9,  0,  4,  5,  6,  3,  8,  2, 10, 11, 12, 13, 14,  7],
      dtype=int64)

五、ファンシーインデックス

import numpy as np
x = np.arange(16)

我々は数を取るために3-9からの2つの間隔が必要な場合は?

x[3:9:2]

実行出力:配列([3,5,7])

我々は、データを取得する必要がある場合も同様に、それを間隔を置いて配置されていませんか?

idx = [3, 5, 8]
x[idx]

実行出力:配列([3,5,8])

ind = np.array([[2, 3],
               [4, 5]])
x[ind]

出力を実行します。

array([[2, 3],
       [4, 5]])
X = x.reshape(4, -1)
row = np.array([0, 1, 2])
col = np.array([1, 2, 3])
X[row, col]

実行出力:配列([1、6、11])

col = [True, False, True, True]
X[1:3, col]

出力を実行します。

array([[ 4,  6,  7],
       [ 8, 10, 11]])

六、Numpy.array比較

import numpy as np
x = np.arange(16)
x > 3

出力を実行します。

array([False, False, False, False,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True])
  • '>'

  • '<'

  • '> ='

  • '<='

  • '=='

  • '!='

    集計操作と組み合わせることだけで、いくつかの演習を学びました。

np.sum(x <= 3)

出力を実行します。4

np.sum((x >= 3) & (x <= 10))

出力を実行します。8

np.count_nonzero(x <= 3)        # True为1,False为0

出力を実行します。4

  • np.any()
  • np.all()
  • そして - &
  • それとも - |
  • 非 - 〜

私は尻尾です

各1つの毒チキンスープ:あなた自身を触れないでください。ほとんどの人は努力に見えるが、愚かで発生します。

私は、あなたがフリーで、やりました!

推奨:画像ビューア、プレビューが容易

honeyview

ちょっと待って!

おすすめ

転載: www.cnblogs.com/zhangkanghui/p/11280845.html