Присвоение прерывистым слайсам в питоне - PullRequest
2 голосов
/ 22 июня 2011

В Matlab я могу сделать это:

s1 = 'abcdef'
s2 = 'uvwxyz'

s1(1:2:end) = s2(1:2:end)

s1 is now 'ubwdyf'

Это всего лишь пример общего:

A(I) = B

Где A, B - векторы, I - вектор индексов иB такой же длины, как и я. (Я игнорирую матрицы на данный момент).

Каким будет Python-эквивалент общего случая в Python?Предпочтительно, он также должен работать на jython / ironpython (без numpy)

Редактировать : я использовал строки в качестве простого примера, но я искал решения со списками (как уже было опубликовано, вау)за.Спасибо.

Ответы [ 3 ]

6 голосов
/ 22 июня 2011
>>> s1 = list('abcdef')
>>> s2 = list('uvwxyz')
>>> s1[0::2] = s2[0::2]
>>> s1
['u', 'b', 'w', 'd', 'y', 'f']
>>> ''.join(s1)
'ubwdyf'

Основные отличия:

  • Строки неизменны в Python. Вместо этого вы можете использовать списки символов.
  • Индексирование основано на 0 в Python.
  • Синтаксис нарезки [start : stop : step], где все параметры являются необязательными.
1 голос
/ 22 июня 2011

Строки являются неизменяемыми в Python, поэтому я буду использовать списки в моих примерах.

Вы можете назначить ломтики следующим образом:

a = range(5)
b = range(5, 7)
a[1::2] = b
print a

, который будет печатать

[0, 5, 2, 6, 4]

Это будет работать только для срезов с постоянным приращением. Для более общего A[I] = B вам нужно использовать цикл for:

for i, b in itertools.izip(I, B):
    A[i] = b
0 голосов
/ 22 июня 2011

Массивы NumPy можно индексировать произвольным списком, как в Matlab:

>>> x = numpy.array(range(10)) * 2 + 5
>>> x
array([ 5,  7,  9, 11, 13, 15, 17, 19, 21, 23])
>>> x[[1,6,4]]
array([ 7, 17, 13])

и назначение:

>>> x[[1,6,4]] = [0, 0, 0]
>>> x
array([ 5,  0,  9, 11,  0, 15,  0, 19, 21, 23])

К сожалению, я не думаю, что можно получить это без тупика, поэтому вам просто нужно зацикливаться на них.

...