2017-01-04 3 views
0

Ich möchte ein numpy Array machen, die ein Float als Indizes (wie zum Beispiel eine Pandas-Serie würde, wenn es einen Index vom Float-Typ hätte) nimmt. Lass mich das erklären. Ich möchte so etwas wie:Float-Indexer zu numpy Array

i = np.array([(5.,1), (6.,2)], dtype=[('foo', 'f4'),('bar', 'i4')]) 

wenn der erste Typ (der ‚foo‘ Typ), könnte als Indexer verwendet werden. So konnte ich

print(i[:5.5]) 

tun und es würde drucken 1 oder (5., 1).

Ich bin mir ziemlich sicher, dass das mit Numpy möglich ist, ich weiß einfach nicht wie.

+0

Sie wollen float * slicing * es scheint. –

Antwort

2

Sie könnten logische Indizierung benötigen:

i[i['foo'] < 5.5] 

# array([(5.0, 1)], 
#  dtype=[('foo', '<f4'), ('bar', '<i4')]) 
0

i[:5.5] keine offensichtliche Bedeutung haben.

i[:5] bedeutet die ersten 5 Elemente des Arrays (oder der Liste). i[:6] die erste 6. Was soll es mit der 5.5 tun? floor(5.5)? Decke? 5 und halbe Elemente zurückgeben? 5 Elemente plus eine lineare Interpolation zwischen dem 5. und 6.?

Eigentlich :5.5 Werke (in 1.11), aber mit einer Warnung:

In [346]: np.arange(10)[:5] 
Out[346]: array([0, 1, 2, 3, 4]) 
In [347]: np.arange(10)[:5.5] 
/usr/local/bin/ipython3:1: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future 
    #!/usr/bin/python3 
Out[347]: array([0, 1, 2, 3, 4]) 

Mit Ihrer strukturierten Array arbeitet Rekord Indizierung auf die gleiche Weise:

In [349]: i = np.array([(5.,1), (6.,2)], dtype=[('foo', 'f4'),('bar', 'i4')]) 
In [350]: i[:5] 

Es ist okay, über das Ende zu schneiden - es gibt einfach alles zurück.

Out[350]: 
array([(5.0, 1), (6.0, 2)], 
     dtype=[('foo', '<f4'), ('bar', '<i4')]) 
In [351]: i[:5.5] 
/usr/local/bin/ipython3:1: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future 
    #!/usr/bin/python3 
Out[351]: 
array([(5.0, 1), (6.0, 2)], 
     dtype=[('foo', '<f4'), ('bar', '<i4')]) 

================

Indizierung in numpy ist nur eine Möglichkeit des Zählens. Es gibt keine Indexierungs- oder Beschriftungsliste oder ein Array. Das ist etwas, das pandas hinzugefügt hat, aber es ist kein Teil von numpy. In Ihrem i Array haben Felder Namen, z. i['foo']. Es kann wie eine Spaltenbeschriftung aussehen, aber es ist gefährlich, strukturierte Felder mit 2D-Spalten zu verwechseln.