множественный наследование / многоуровневое наследование Python - PullRequest
2 голосов
/ 18 января 2012

Мне было интересно, существует ли простой способ создания класса для обработки как целочисленных, так и ключевых слов для индексации массива чисел.

Конечной целью является создание массива, который я также могу индексировать, используя имена каждой переменной. Например, если у меня есть списки

import numpy as np
a = [0,1,2,3,4]
names = ['name0','name1','name2','name3','name4']
A = np.array(a)

Я бы хотел иметь возможность легко получить значения A с помощью вызова (например) A ['name1'], но при этом массив сохраняет все функциональные возможности массива numpy.

Спасибо!

Peter

Изменить:

Большое спасибо за помощь, я постараюсь быть более понятным по назначению! У меня есть существующий набор кода, который использует массив NumPy для хранения и применения вектора переменных. В моем векторе около 30 записей.

Когда я хочу увидеть значение определенной переменной или когда я хочу внести изменения в одну из них, я должен запомнить, какая запись соответствует какой переменной (порядок или количество записей не обязательно изменяются как только массив создан). Прямо сейчас я использую словарь для отслеживания. Например, у меня есть пустой массив VarVector с 30 значениями. «vmax» - это запись 15 со значением 0,432. Затем у меня будет параллельный словарь с 30 ключами 'VarDict', такой что VarDict [entry] = index. Таким образом, я могу найти значение vmax, связав вызовы

VarVector [VarDict [ "Vmax"]]

, что вернет 0,432

Мне было интересно, будет ли хороший способ простого объединения этих двух структур, чтобы VarVector [15] (для совместимости) и VarVector ["vmax"] (для удобства для меня) указывали на одно и то же число .

Спасибо! Питер

Ответы [ 3 ]

1 голос
/ 18 января 2012

Из вашего описания это звучит так, как будто вы просто хотите структурированный массив (который встроен в numpy). Э.Г.

# Let's suppose we have 30 observations with 5 variables each...
# The five variables are temp, pressure, x-velocity, y-velocity, and z-velocity
x = np.random.random((30, 5))

# Make a structured dtype to represent our variables...
dtype=dict(names=['temp', 'pressure', 'x_vel', 'y_vel', 'z_vel'],
           formats=5 * [np.float])

# Now view "x" as a structured array with the dtype we created...
data = x.view(dtype)

# Each measurement will now have the name fields we created...
print data[0]
print data[0]['temp']

# If we want, say, all the "temp" measurements:
print data['temp']

# Or all of the "temp" and "x_vel" measurements:
print data[['temp', 'x_vel']]

Также взгляните на массив массивов . Они немного более гибкие, но значительно медленнее.

data = np.rec.fromarrays(*x, 
              names=['temp', 'pressure', 'x_vel', 'y_vel', 'z_vel'])
print data.temp

Однако вскоре вы столкнетесь с ограничениями любого из этих методов (то есть вы можете назвать обе оси). В этом случае посмотрите на larry, если вы просто хотите пометить элементы, или pandas, если вы хотите иметь помеченные массивы с большим количеством приятных пропущенных. обработка значений.

0 голосов
/ 18 января 2012

Вы можете создать подкласс ndarray и переопределить соответствующие методы (например, __getitem__, __setitem__, ...). Подробнее здесь .Это похоже на ответ @ Joe, но имеет то преимущество, что оно сохраняет почти все функциональные возможности ndarray.Очевидно, вы больше не сможете делать следующее:

In [25]: array = np.empty(3, dtype=[('char', '|S1'), ('int', np.int)])

In [26]: array['int'] = [0, 1, 2]

In [27]: array['char'] = ['a', 'b', 'c']

In [28]: array
Out[28]: 
array([('a', 0), ('b', 1), ('c', 2)], 
      dtype=[('char', '|S1'), ('int', '<i8')])

In [29]: array['char']
Out[29]: 
array(['a', 'b', 'c'], 
      dtype='|S1')

In [30]: array['int']
Out[30]: array([0, 1, 2])

Если бы мы знали, почему вы хотели это сделать, мы могли бы дать более подробный ответ.

0 голосов
/ 18 января 2012

Я не проверял это, но оно должно работать.

Идея состоит в том, чтобы предположить, что ввод является int, и использовать его для массива numpy, а если это не так, использовать его для dict.

import numbers
import numpy

class ThingArray:
    def __init__(self):
        self.numpy_array = numpy.array()
        self.other_array = dict()

    def __setitem__(self, key, value):
        if isinstance(key, numbers.Integral):
            self.numpy_array[key] = value
        else:
            self.other_array[key] = value

    def __getitem__(self, key):
        if isinstance(key, numbers.Integral):
            return self.numpy_array[key]
        else:
            return self.other_array[key]


thing = ThingArray()

thing[1] = 100
thing["one"] = "hundred"        

print thing[1]
print thing["one"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...