tekenreeksrepresentatie van een numpy-array met komma’s die de elementen scheiden

Ik heb een numpy array, bijvoorbeeld:

points = np.array([[-468.927,  -11.299,   76.271, -536.723],
                   [-429.379, -694.915, -214.689,  745.763],
                   [   0.,       0.,       0.,       0.   ]])

als ik het afdruk of er een string van maak met str() krijg ik:

print w_points
[[-468.927  -11.299   76.271 -536.723]
 [-429.379 -694.915 -214.689  745.763]
 [   0.       0.       0.       0.   ]]

Ik moet er een string van maken die wordt afgedrukt met scheidingskomma’s terwijl de 2D-arraystructuur behouden blijft, dat wil zeggen:

[[-468.927,  -11.299,   76.271, -536.723],
 [-429.379, -694.915, -214.689,  745.763],
 [   0.,       0.,       0.,       0.   ]]

Weet iemand een gemakkelijke manier om een ​​numpy array om te zetten in die vorm van string?

Ik weet dat .tolist() de komma’s toevoegt, maar het resultaat verliest de 2D-structuur.


Antwoord 1, autoriteit 100%

Probeer repr

te gebruiken

>>> import numpy as np
>>> points = np.array([[-468.927,  -11.299,   76.271, -536.723],
...                    [-429.379, -694.915, -214.689,  745.763],
...                    [   0.,       0.,       0.,       0.   ]])
>>> print(repr(points))
array([[-468.927,  -11.299,   76.271, -536.723],
       [-429.379, -694.915, -214.689,  745.763],
       [   0.   ,    0.   ,    0.   ,    0.   ]])

Als u van plan bent grote numpy-arrays te gebruiken, stelt u eerst np.set_printoptions(threshold=np.nan)in. Zonder dit wordt de array-representatie afgekapt na ongeveer 1000 items (standaard).

>>> arr = np.arange(1001)
>>> print(repr(arr))
array([   0,    1,    2, ...,  998,  999, 1000])

Natuurlijk, als je zo grote arrays hebt, wordt dit minder nuttig en moet je de gegevens waarschijnlijk op een andere manier analyseren dan er alleen naar te kijken en er zijn betere manierenom een ​​numpy-array te behouden dan zijn reprin een bestand op te slaan. ..


Antwoord 2, autoriteit 49%

Nu, in numpy 1.11, is er numpy.array2string:

In [279]: a = np.reshape(np.arange(25, dtype='int8'), (5, 5))
In [280]: print(np.array2string(a, separator=', '))
[[ 0,  1,  2,  3,  4],
 [ 5,  6,  7,  8,  9],
 [10, 11, 12, 13, 14],
 [15, 16, 17, 18, 19],
 [20, 21, 22, 23, 24]]

Vergeleken met reprvan @mgilson (toont “array()” en dtype):

In [281]: print(repr(a))
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]], dtype=int8)

P.S. Heb nog steeds np.set_printoptions(threshold=np.nan)nodig voor grote array.


Antwoord 3, autoriteit 3%

Een andere manier om dit te doen, wat vooral handig is als een object geen __repr__()-methode heeft, is door de pprint-module van Python te gebruiken (die verschillende opmaakopties heeft). Zo ziet dat er bijvoorbeeld uit:

>>> import numpy as np
>>> import pprint
>>>
>>> A = np.zeros(10, dtype=np.int64)
>>>
>>> print(A)
[0 0 0 0 0 0 0 0 0 0]
>>>
>>> pprint.pprint(A)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

Antwoord 4

De functie die je zoekt is np.set_string_function. bron

Wat deze functie doet, is dat je de standaardfuncties __str__of __repr__voor de numpy-objecten kunt overschrijven. Als u de vlag reprinstelt op True, wordt de functie __repr__overschreven door uw aangepaste functie. Evenzo, als u repr=Falseinstelt, wordt de functie __str__overschreven. Aangezien printde functie __str__van het object aanroept, moeten we repr=Falseinstellen.

Bijvoorbeeld:

np.set_string_function(lambda x: repr(x), repr=False)
x = np.arange(5)
print(x)

drukt de uitvoer af

array([0, 1, 2, 3, 4])

Een meer esthetisch aangename versie is

np.set_string_function(lambda x: repr(x).replace('(', '').replace(')', '').replace('array', '').replace("       ", ' ') , repr=False)
print(np.eye(3))

wat geeft

[[1., 0., 0.],
 [0., 1., 0.],
 [0., 0., 1.]]

Ik hoop dat dit je vraag beantwoordt.

Other episodes