web-dev-qa-db-ja.com

NumPy配列内の特定の列全体でスカラーを乗算する方法は?

水文地質学のフィールドワークからの大規模なデータセットに対して分析を行う必要があります。 NumPyを使用しています。どうすればよいか知りたい:

  1. 乗算する配列の2列目を数値で指定します(例:5.2)。その後

  2. その列の数値の累積合計を計算します。

既に述べたように、配列全体ではなく、特定の列のみを操作したいと思います。

24
Mary Jane
 you can do this in two simple steps using NumPy:

>>> # multiply column 2 of the 2D array, A, by 5.2
>>> A[:,1] *= 5.2

>>> # assuming by 'cumulative sum' you meant the 'reduced' sum:
>>> A[:,1].sum()

>>> # if in fact you want the cumulative sum (ie, returns a new column)
>>> # then do this for the second step instead:
>>> NP.cumsum(A[:,1])

いくつかの模擬データで:

>>> A = NP.random.Rand(8, 5)
>>> A
  array([[ 0.893,  0.824,  0.438,  0.284,  0.892],
         [ 0.534,  0.11 ,  0.409,  0.555,  0.96 ],
         [ 0.671,  0.817,  0.636,  0.522,  0.867],
         [ 0.752,  0.688,  0.142,  0.793,  0.716],
         [ 0.276,  0.818,  0.904,  0.767,  0.443],
         [ 0.57 ,  0.159,  0.144,  0.439,  0.747],
         [ 0.705,  0.793,  0.575,  0.507,  0.956],
         [ 0.322,  0.713,  0.963,  0.037,  0.509]])

>>> A[:,1] *= 5.2

>>> A
  array([[ 0.893,  4.287,  0.438,  0.284,  0.892],
         [ 0.534,  0.571,  0.409,  0.555,  0.96 ],
         [ 0.671,  4.25 ,  0.636,  0.522,  0.867],
         [ 0.752,  3.576,  0.142,  0.793,  0.716],
         [ 0.276,  4.255,  0.904,  0.767,  0.443],
         [ 0.57 ,  0.827,  0.144,  0.439,  0.747],
         [ 0.705,  4.122,  0.575,  0.507,  0.956],
         [ 0.322,  3.71 ,  0.963,  0.037,  0.509]])

>>> A[:,1].sum()
  25.596156138451427

numPyで要素の選択(インデックス付け)を行うには、いくつかの単純なルールが必要です。

  • NumPyは、Pythonと同様に0から始まるため、たとえば、以下の「1」は2番目の列を指します。

  • カンマは角括弧内の次元を区切るため、[行、列]、たとえば、A [2,3]は、行3、列4のアイテム(「セル」)を意味します

  • コロンは、その次元に沿った要素のallを意味します。たとえば、A [:、1]は、Aの列2のビューを作成します。 A [3 ,:]は4番目の行を参照します

31
doug

承知しました:

import numpy as np
# Let a be some 2d array; here we just use dummy data 
# to illustrate the method
a = np.ones((10,5))
# Multiply just the 2nd column by 5.2 in-place
a[:,1] *= 5.2

# Now get the cumulative sum of just that column
csum = np.cumsum(a[:,1])

これをインプレースで実行したくない場合は、少し異なる戦略が必要になります。

b = 5.2*a[:,1]
csum = np.cumsum(b)
6
JoshAdel

定数と特定の列または行を乗算するには:

import numpy as np;
X=np.ones(shape=(10,10),dtype=np.float64);
X;

### this is our default matrix
array([[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
   [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
   [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
   [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
   [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
   [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
   [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
   [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
   [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
   [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]])



 ## now say we want to multiple it with 10

 X=X*10;

array([[10., 10., 10., 10., 10., 10., 10., 10., 10., 10.],
   [10., 10., 10., 10., 10., 10., 10., 10., 10., 10.],
   [10., 10., 10., 10., 10., 10., 10., 10., 10., 10.],
   [10., 10., 10., 10., 10., 10., 10., 10., 10., 10.],
   [10., 10., 10., 10., 10., 10., 10., 10., 10., 10.],
   [10., 10., 10., 10., 10., 10., 10., 10., 10., 10.],
   [10., 10., 10., 10., 10., 10., 10., 10., 10., 10.],
   [10., 10., 10., 10., 10., 10., 10., 10., 10., 10.],
   [10., 10., 10., 10., 10., 10., 10., 10., 10., 10.],
   [10., 10., 10., 10., 10., 10., 10., 10., 10., 10.]])

### Now if, we want to mulitply 3,5, 7 column with 5

X[:,[3,5,7]]=X[:,[3,5,7]]*5

 array([[10., 10., 10., 50., 10., 50., 10., 50., 10., 10.],
   [10., 10., 10., 50., 10., 50., 10., 50., 10., 10.],
   [10., 10., 10., 50., 10., 50., 10., 50., 10., 10.],
   [10., 10., 10., 50., 10., 50., 10., 50., 10., 10.],
   [10., 10., 10., 50., 10., 50., 10., 50., 10., 10.],
   [10., 10., 10., 50., 10., 50., 10., 50., 10., 10.],
   [10., 10., 10., 50., 10., 50., 10., 50., 10., 10.],
   [10., 10., 10., 50., 10., 50., 10., 50., 10., 10.],
   [10., 10., 10., 50., 10., 50., 10., 50., 10., 10.],
   [10., 10., 10., 50., 10., 50., 10., 50., 10., 10.]])

同様に、どの列にもそれを行うことができます。それが明確になることを願っています。

0