как изменить столбец массивов numpy, хранящихся в списке

#python #arrays #list #numpy

Вопрос:

У меня есть список массивов numpy, и я хочу изменить некоторые числа массивов. Это мой упрощенный список:

 first_list=[np.array([[1.,2.,0.], [2.,1.,0.], [6.,8.,3.], [8.,9.,7.]]),
            np.array([[1.,0.,2.], [0.,0.,2.], [5.,5.,1.], [0.,6.,2.]])]
 

У меня есть коэффициент, который определяет, сколько разбиений у меня в каждом массиве:

 spl_array=2.
 

это означает, что каждый массив списка может быть разделен на 2. Я хочу добавить фиксированное значение ( 3. ) в последний столбец каждого разделения каждого массива, а также скопировать последнее разделение и вычесть это значение ( 3. ) из третьего столбца этого скопированного разделения. Наконец, я хочу, чтобы это выглядело следующим образом:

 final_list=[np.array([[1.,2.,3.], [2.,1.,3.], [6.,8.,6.], [8.,9.,10.], 
                      [6.,8.,0.], [8.,9.,4.]]), # copied and subtracted
            np.array([[1.,0.,5.], [0.,0.,5.], [5.,5.,4.], [0.,6.,5.], 
                      [5.,5.,-2.], [0.,6.,-1.]])] # copied and subtracted
 

Я попробовал несколько петель, но полностью проиграл. Заранее благодарю за любую помощь.

 final_list=[]
for i in first_list:
    each_lay=np.split (i, spl_array)
    for j in range (len(each_lay)):
        final_list.append([each_lay[j][:,0], each_lay[j][:,1], each_lay[j][:,2] 3])
 

Комментарии:

1. Я не понимаю, как вы получаете 0, 0, -2, -1. Не могли бы вы объяснить мне, пожалуйста? Я думал 0, 4, -2, -1

2. Дорогой @Corralien, отчасти это была моя вина. Сначала 0 следует 4. объяснить это. Значение последнего столбца последнего разбиения первого массива равно 3. и 7. , я скопировал это разбиение и вычитал последний столбец на 3. , так что последним столбцом скопированного разбиения будет 0 и 4. . Для второго массива последним столбцом последнего разбиения является 1. и 2. , поэтому, если я вычту 3. из них, это будет -2. и -1. .

3. все ли массивы в списке одинаковы?

4. Уважаемый @yan ziselman, да, все массивы имеют одинаковую длину. Я действительно ценю вашу помощь.

5. есть ли причина, по которой вы не складываете весь массив в один массив?

Ответ №1:

Это то, чего ты ожидаешь:

 m = np.asarray(first_list)
m = np.concatenate((m, m[:, 2:]), axis=1)

m[:, :4, 2]  = 3
m[:, 4:, 2] -= 3

final_list = m.tolist()
 
 >>> m
array([[[  1.,   2.,   3.],
        [  2.,   1.,   3.],
        [  6.,   8.,   6.],
        [  8.,   9.,  10.],
        [  6.,   8.,   0.],
        [  8.,   9.,   4.]],
       [[  1.,   0.,   5.],
        [  0.,   0.,   5.],
        [  5.,   5.,   4.],
        [  0.,   6.,   5.],
        [  5.,   5.,  -2.],
        [  0.,   6.,  -1.]]])