2016-06-21 11 views
3

私は実際に理解していないコードを見つけました。それは基本的にこのように書きます:インデックス付きnumpy配列とブール値

array = np.ones((5, 4))*np.nan 
s1 = pd.Series([1,4,0,4,5], index=[0,1,2,3,4]) 
I = s1 == 4 
print(I) 

0 False 
1  True 
2 False 
3  True 
4 False 
dtype: bool 

私は本当にそれが4であるインデックスでTrueとブールのpd.Seriesを返し、この部分を理解しています。さて、著者はインデックスarrayIを使用しています。

array[I,0] = 3 
array[I,1] = 7 
array[I,2] = 2 
array[I,3] = 5 
print(array) 

[[ 3. 7. 2. 5.] 
[ 3. 7. 2. 5.] 
[ nan nan nan nan] 
[ nan nan nan nan] 
[ nan nan nan nan]] 

新しいarrayは私には意味がありません、私が代わりに返したいと思います:

[[ nan nan nan nan] 
[ 3. 7. 2. 5.] 
[ nan nan nan nan] 
[ 3. 7. 2. 5.] 
[ nan nan nan nan]] 

誰かがここで何が起こっているのかを説明でき、そしてどのように上記のコードを変更して、必要なものを返すことができますか?

答えて

4

説明はnumpyアレイとpandasシリーズは異なっロジックインデックスを扱うという事実にあります。前者はTrueを1とし、Falseを0とし、後者は論理がTrueの値を取り込み、論理値はFalseになります。デモンストレーションとして:

import numpy as np 
import pandas as pd 

arr = np.array([1,2,3,4,5]) 
arr       # this is a numpy array 
array([1, 2, 3, 4, 5]) 
arr[[True, False, True]] 
array([2, 1, 2])    # check here how it is actually picking the value at position 
           # 1 and 0 alternatively; 

ser = pd.Series([1,2,3,4,5]) 
ser       # this is a pandas Series 
0 1 
1 2 
2 3 
3 4 
4 5 
dtype: int64 
ser[[True, False, True]]  # in pandas Series, it will pick up values where the logic is True; 
0 1 
2 3 
dtype: int64 

どのように動作が異なるかを確認します。 arrayは数値配列なので、ロジックインデックスを使用して値を取得することはできません。あなたが意図した結果を得るために、我々はIから真の値のインデックスを抽出して、あなたのarrayにそれを使用しようとすることができます:

array[I[I == True].index,0] = 3 
array[I[I == True].index,1] = 7 
array[I[I == True].index,2] = 2 
array[I[I == True].index,3] = 5 
print(array) 


[[ nan nan nan nan] 
[ 3. 7. 2. 5.] 
[ nan nan nan nan] 
[ 3. 7. 2. 5.] 
[ nan nan nan nan]] 
+0

完全に意味が成り立ちますが、その違いを認識していませんでした!大きなありがとう! –

3

間違いです。 numpyがインデックス内でIをどのように解釈しているのか正確にはわかりません。しかし、私は、これは意図したものであるかなり確信している:

array[I.values, 0] = 3 
array[I.values, 1] = 7 
array[I.values, 2] = 2 
array[I.values, 3] = 5 
print(array) 

[[ nan nan nan nan] 
[ 3. 7. 2. 5.] 
[ nan nan nan nan] 
[ 3. 7. 2. 5.] 
[ nan nan nan nan]] 
+1

注パンダのその '0.18.1'これはその警告を発生させますその動作は将来これで変更されます(または多分暗い警告) – chrisb

関連する問題