Если вам нужен список строк, то вам нужно выполнить итерацию - по каждому элементу. Подобное форматирование строк работает со скалярными элементами, а не с целыми массивами.
Можно генерировать значения, используя операции с целым массивом. Но результатом будет некая форма массива, а не список строк.
Например:
In [198]: list1 = [1, 2, 3, 4, 5]
...: list2 = [6, 7, 8, 9, 10]
In [199]: arr = np.array([list1,list2])
In [200]: arr
Out[200]:
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10]])
Простой способ перебора массива с отображением индексов:
In [201]: list(np.ndenumerate(arr))
Out[201]:
[((0, 0), 1),
((0, 1), 2),
((0, 2), 3),
((0, 3), 4),
((0, 4), 5),
((1, 0), 6),
((1, 1), 7),
((1, 2), 8),
((1, 3), 9),
((1, 4), 10)]
Это все еще итерация. Мы можем получить индексы в виде массива с помощью:
In [215]: np.indices(arr.shape)
Out[215]:
array([[[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1]],
[[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4]]])
In [216]: I,J = np.indices(arr.shape)
и составить эти индексы со значениями:
In [218]: np.stack((I.ravel(),J.ravel(),arr.ravel()),axis=1)
Out[218]:
array([[ 0, 0, 1],
[ 0, 1, 2],
[ 0, 2, 3],
[ 0, 3, 4],
[ 0, 4, 5],
[ 1, 0, 6],
[ 1, 1, 7],
[ 1, 2, 8],
[ 1, 3, 9],
[ 1, 4, 10]])
Чтобы получить приведенные ниже и правильные значения, мы можем сгенерировать дополненный массив:
In [223]: arr1 = np.pad(arr.astype(float),[(0,1),(0,1)],mode='constant',constant_values=np.nan)
...:
In [224]: arr1
Out[224]:
array([[ 1., 2., 3., 4., 5., nan],
[ 6., 7., 8., 9., 10., nan],
[nan, nan, nan, nan, nan, nan]])
Обратите внимание, что мне пришлось преобразовать массив в число с плавающей точкой, чтобы принять значение с плавающей точкой np.nan
.
И объединить все:
In [225]: np.stack((I.ravel(),J.ravel(),arr.ravel(),arr1[1:,:-1].ravel(),arr1[:-1,1:].ravel()),
...: axis=1)
Out[225]:
array([[ 0., 0., 1., 6., 2.],
[ 0., 1., 2., 7., 3.],
[ 0., 2., 3., 8., 4.],
[ 0., 3., 4., 9., 5.],
[ 0., 4., 5., 10., nan],
[ 1., 0., 6., nan, 7.],
[ 1., 1., 7., nan, 8.],
[ 1., 2., 8., nan, 9.],
[ 1., 3., 9., nan, 10.],
[ 1., 4., 10., nan, nan]])
Чтобы получить список строк, мы можем определить формат строки:
In [230]: astr = "Row index={}, Column index={}, Value={}, Value below={}, Value to the right={}"
и применить его для достижения строки (да, это действительно повторяется)
In [233]: for row in Out[225]:
...: print(astr.format(*row))
...:
Row index=0.0, Column index=0.0, Value=1.0, Value below=6.0, Value to the right=2.0
Row index=0.0, Column index=1.0, Value=2.0, Value below=7.0, Value to the right=3.0
Row index=0.0, Column index=2.0, Value=3.0, Value below=8.0, Value to the right=4.0
Row index=0.0, Column index=3.0, Value=4.0, Value below=9.0, Value to the right=5.0
Row index=0.0, Column index=4.0, Value=5.0, Value below=10.0, Value to the right=nan
Row index=1.0, Column index=0.0, Value=6.0, Value below=nan, Value to the right=7.0
Row index=1.0, Column index=1.0, Value=7.0, Value below=nan, Value to the right=8.0
Row index=1.0, Column index=2.0, Value=8.0, Value below=nan, Value to the right=9.0
Row index=1.0, Column index=3.0, Value=9.0, Value below=nan, Value to the right=10.0
Row index=1.0, Column index=4.0, Value=10.0, Value below=nan, Value to the right=nan
Если мы опускаем все эти ravel
мы получаем массив значений 3d:
In [234]: np.stack((I,J,arr,arr1[1:,:-1],arr1[:-1,1:]),axis=2)
Out[234]:
array([[[ 0., 0., 1., 6., 2.],
[ 0., 1., 2., 7., 3.],
[ 0., 2., 3., 8., 4.],
[ 0., 3., 4., 9., 5.],
[ 0., 4., 5., 10., nan]],
[[ 1., 0., 6., nan, 7.],
[ 1., 1., 7., nan, 8.],
[ 1., 2., 8., nan, 9.],
[ 1., 3., 9., nan, 10.],
[ 1., 4., 10., nan, nan]]])
In [235]: _.reshape(-1,5) # to get the 2d array
...