2016-01-26 3 views
1

У меня есть небольшое моделирование, которое принимает 3 входных значения, запускает 100 случайных реализаций и находит среднее и стандартное отклонение 5 выходных измерений.Поиск многомерного массива

Входы и выходы Мне нужно как-то хранить и таким образом, чтобы их можно было легко искать и строить/анализировать выходы для разных наборов входных параметров.

Сейчас у меня большой 23 * (количество комбинаций входных параметров) массива и попытаться найти, скажем, среднее значение первого выходного параметра, используя mean_of_a = data[3][[data[0]==x] and [data[1]==y] and [data[2]==z]]

Это, кажется, не будет работать и Я уверен, что должен быть более эффективный способ сделать это. Какие-либо предложения?

+2

вы могли бы включать в себя упрощенную версию списка вы хотите найти? Я думаю, что я могу решить это с помощью рекурсии, но я немного смущен тем, с чем вы работаете –

+1

(1) Я согласен с приведенным выше комментарием. (2) Вы понимаете, что данные [0] = x являются оператором присваивания? что вы пытаетесь сделать там? –

+0

Нужно ли хранить его только с помощью 'numpy'? Я думаю, что это то, что ['pandas'] (http://pandas.pydata.org/) действительно хорошо. – Paul

ответ

0

У вас возникли проблемы с управлением структурированными данными. Это похоже на хороший вариант использования для namedtuple, который является более простой версией класса.

from collections import namedtuple 

Input = namedtuple('Input', ['x', 'y', 'z']) 
Output = namedtuple('Output', ['v1', 'v2', 'v3', 'v4', 'v5']) 

results = [] 

for i in range(100): 
    input = Input(x, y, z) 
    # do your thing 
    output = Output(v1, v2, v3, v4, v5) 
    results.append((input, output)) 

Теперь у вас есть список пар ввода/вывода. Вы можете выполнять итерацию и доступ к этим членам с использованием точечной нотации.

Например - если вы используете numpy:

import numpy 
print 'v1 mean', numpy.mean([r[1].v1 for r in results]) 
print 'v2 mean', numpy.mean([r[1].v2 for r in results]) 
1

Предполагая, что ваша матрица (parameters, repetitions), есть несколько вещей, которые не так с вашей булевой индексацией в его нынешнем виде:

  • data[0]=x назначает значение x - data[0]. Для проверки равенства вам необходимо использовать ==.
  • Квадратные скобки используются для построения списков или для индексирования в предыдущую переменную. Вы должны использовать круглые скобки вокруг своих сравнений.
  • Для массивов numpy вам необходимо использовать побитовое и (&), а не and, что справедливо только для скаляров.

Вы хотите что-то больше, как это:

mean_of_a = data[3][(data[0] == x) & (data[1] == y) & (data[2] == z)].mean() 

С Numpy массивов это более эффективно делать все ваши индексации в один присест, а не «СЦЕПЛЕНИЕ» ваших операций индексации.

(data[0] == x) & (data[1] == y) & (data[2] == z) 

должен возвращать булево вектор, длина которого совпадает с числом столбцов в data. Таким образом, вы можете использовать его индексировать непосредственно в втором измерении data, а не первой индексации 4-й ряд:

mean_of_a = data[3, (data[0] == x) & (data[1] == y) & (data[2] == z)].mean()