Создание нового массива на основе первого элемента каждого элемента в текущем массиве - PullRequest
1 голос
/ 15 октября 2019

Пожалуйста, прости меня, если моя терминология неверна - я новичок в этом!

Я пытаюсь изолировать определенные записи на основе значения первого элемента в каждом элементе массива ивыполнить некоторые операции над определенными столбцами. Вот пример типа данных, с которыми я работаю:

[[1, 99, 400],
[1, 95, 200],
[2, 92, 100],
[1, 85, 500],
[2, 88, 300]]

Мне нужно выяснить средние значения столбцов 2 и 3, используя for loop, if statement и арифметику соответственно,для каждого условия (отражено в столбце 1, где значения равны 1 или 2).

Я пытаюсь разбить вышеуказанный массив на два отдельных массива для каждого условия, а затем взять среднее значение этих столбцов, используяnumpy.mean. Вот как я хочу, чтобы списки выглядели так:

cond1 = [[1, 99, 400], [1, 95, 200], [1, 85, 500]]
cond2 = [[2, 92, 100], [2, 88, 300]]

Я застрял на том, как разделить эти условия на два новых массива на основе первого элемента. Вот самое далекое, что я получил после поиска в Google по поводу нарезки ... но я застрял!

for x in stim:
    if stim_acc[0]==1.0:
        np.where(stim_acc[0] = 1.0)
        cond1 = [[s,a,rt] for s, a, rt in zip(stim, acc, mrt)]
        print(cond1)

относительно stim, acc и mrt:

У меня естьнабор данных длиной в несколько столбцов, из которого я выделил записи в новый список (первый в этом посте) (теперь stim), точность (теперь acc) и среднее время реакции (теперь mrt)). Я сделал это так:

stim = data[:,1]
 acc = data[:,3]
 mrt = data[:,4]

 stim_acc = [[s, a, rt] for s, a, rt in zip(stim, acc, mrt)]
 print(stim_acc)

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

Спасибо, любая помощь очень ценится.

Ответы [ 3 ]

0 голосов
/ 15 октября 2019

используйте панд groupby:

>>> a = [[1, 99, 400],
 [1, 95, 200],
 [2, 92, 100],
 [1, 85, 500],
 [2, 88, 300]]
>>> df = pd.DataFrame(a)
>>> df
   0   1    2
0  1  99  400
1  1  95  200
2  2  92  100
3  1  85  500
4  2  88  300
>>> data = df.groupby([0])
>>> cond = data.groups
>>> df.loc[cond[1]]
   0   1    2
0  1  99  400
1  1  95  200
3  1  85  500
>>> df.loc[cond[2]]
   0   1    2
2  2  92  100
4  2  88  300
0 голосов
/ 15 октября 2019

Используя простой цикл, вы можете отобразить следующие средства:

data=[[1, 99, 400],
[1, 95, 200],
[2, 92, 100],
[1, 85, 500],
[2, 88, 300]]

groups = [], []
for row in data:
    groups[row[0]-1].append(row)

for group in groups:
    print(np.mean(group, axis=0))  # means of each column by group

Но часто лучше использовать кадр данных pandas для задач этого типа

df = pd.DataFrame(data, columns=["stim", "acc", "mrt"])
for value in df.stim.unique():
    print(df[df.stim == value].mean())

или

for i, group in df.groupby("stim"):
    print(i, group.mean())

(Я полагаю, вы хотите, чтобы средства каждого столбца в каждой группе.)

0 голосов
/ 15 октября 2019

Как я понимаю, вы хотите разделить свой список на два списка по значению индекса [0]. Если это 1, то добавьте в список cond1, иначе добавьте в список cond2. Вы можете реализовать это с помощью этого кода:

cond1=[]
cond2=[]
for item in listoflists:
    if item[0] == 1:
        cond1.append(item)
    else 
        cond2.append(item)
...