web-dev-qa-db-fra.com

type numpy.void - comment l'utiliser?

J'ai chargé un MATLAB .mat fichier via scipy.io.loadmat et il m'a donné une liste de numpy.void objets.

Quelqu'un peut-il me dire de quoi il s'agit, comment les utiliser et où puis-je trouver des références documentation sur eux?

34
Felix

Selon la documentation numpy: http://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html , les types numpy.void Sont définis comme types de données flexibles . Fondamentalement, ce sont des types de données où aucun type prédéfini n'est associé aux variables que vous regardez. Si vous regardez numpy, vous avez des types de données tels que float, uint8, bool, string, etc.

void est destiné à accueillir des types plus génériques et flexibles et concerne les types de données qui ne tombent pas nécessairement dans l'un de ces types de données prédéfinis. Cette situation se produit principalement lorsque vous chargez dans un struct où chaque élément a plusieurs types de données associés à plusieurs champs. Chaque élément de structure peut avoir une combinaison de différents types de données, et la fusion de tous ces types de données pour représenter une instance de cet élément de structure nous conduit donc à numpy.void.

Avec la documentation, vous pouvez certainement effectuer les mêmes opérations que vous le feriez avec n'importe quel autre type de données. Jetez un œil aux méthodes de type de données generic ici: http://docs.scipy.org/doc/numpy/reference/generated/numpy.generic.html#numpy.generic . En fait, tous les types de données numpy sont dérivés de cette classe générique, y compris numpy.void.

Dans le premier lien que j'ai fourni au début de cet article, il montre un bon exemple de la façon de créer un type d'enregistrement personnalisé, où un enregistrement est une combinaison d'un tuple de nombres et d'une chaîne. Lors de la création d'une liste de ces enregistrements, chaque type de la liste est de type numpy.void Et il montre qu'un enregistrement est de ce type de données. Cependant, gardez à l'esprit que cette liste d'enregistrements a un type de données qui appartient à cet enregistrement , mais chaque élément de cette liste sera de type numpy.void.


Cependant, dans un souci d'auto-confinement, recréons l'exemple ici: Créons un type d'enregistrement personnalisé où il a deux champs associés pour chaque variable que vous créez:

  • Une chaîne de 16 bits avec un champ nommé name
  • Un tuple à 2 éléments de nombres à virgule flottante de 64 bits chacun, avec un champ nommé grades

En tant que tel, vous feriez quelque chose comme:

import numpy as np
dt = np.dtype([('name', np.str_, 16), ('grades', np.float64, (2,))])

En tant que tel, créons un exemple de liste de deux éléments et instancions leurs champs:

x = np.array([('Sarah', (8.0, 7.0)), ('John', (6.0, 7.0))], dtype=dt)

Parce que nous avons fait de cette liste un numpy.array, Nous nous attendons à ce que son type de données soit ainsi:

type(x)

On a:

<type 'numpy.ndarray'>

N'oubliez pas que la liste elle-même est un numpy.array, Mais pas les éléments individuels.


Pour accéder au deuxième élément de cette liste, qui est le deuxième enregistrement, nous faisons:

x[1]

On a:

('John', [6.0, 7.0])

Pour vérifier le type du deuxième enregistrement, nous faisons:

type(x[1])

On a:

<type 'numpy.void'> # As expected

Quelques bonus supplémentaires pour vous

Pour accéder au nom du deuxième enregistrement, nous faisons:

x[1]['name']

On a:

'John'

Pour accéder aux notes du deuxième record, nous faisons:

x[1]['grades']

On a:

array([ 6.,  7.])

Pour vérifier le type du nom à l'intérieur du deuxième enregistrement, nous faisons:

type(x[1]['name'])

On a:

<type 'numpy.string_'>

Pour vérifier le type des notes à l'intérieur du deuxième enregistrement, nous faisons:

type(x[1]['grades'])

On a:

<type 'numpy.ndarray'>

Notez que chaque élément de cette liste est de type numpy.void. Cependant, les champs individuels pour chaque élément de notre liste sont soit un tuple de nombres, soit une chaîne. La collection de ces éléments ensemble est de type numpy.void.

57
rayryeng