Как объединить фрагменты строк, чтобы создать новую строку в Python - PullRequest
0 голосов
/ 16 мая 2018

В Python мне нужно разделить две строки пополам, взять первую половину из строки 1 и вторую половину из строки 2 и объединить их в массив, который затем сохраняется как строка в другом 2d-массиве.например,

values=np.array([[1,2,3,4],[5,6,7,8]])

станет

Y[2,:]= ([1,2,7,8]))  // 2 is arbitrarily chosen 

Я пытался сделать это с конкатенацией, но получил ошибку

только целочисленные скалярные массивы могут быть преобразованы вскалярный индекс

x=values.shape[1] 
pop[y,:]=np.concatenate(values[temp0,0:int((x-1)/2)],values[temp1,int((x-1)/2):x+1])

temp0 и temp1 являются целыми числами, а значения - это двумерный целочисленный массив измерений (100, x)

Ответы [ 4 ]

0 голосов
/ 16 мая 2018

np.concatenate принимает список массивов, плюс скалярный параметр axis (необязательно)

In [411]: values=np.array([[1,2,3,4],[5,6,7,8]])
     ...: 

Ничего плохого в том, как вы делите values:

In [412]: x=values.shape[1] 
In [413]: x
Out[413]: 4
In [415]: values[0,0:int((x-1)/2)],values[1,int((x-1)/2):x+1]
Out[415]: (array([1]), array([6, 7, 8]))

неправильный:

In [416]: np.concatenate(values[0,0:int((x-1)/2)],values[1,int((x-1)/2):x+1])
----
TypeError: only integer scalar arrays can be converted to a scalar index

Он пытается интерпретировать второй аргумент как параметр оси, отсюда и сообщение об ошибке scalar.

вправо:

In [417]: np.concatenate([values[0,0:int((x-1)/2)],values[1,int((x-1)/2):x+1]])
Out[417]: array([1, 6, 7, 8])

Естьдругие concatenate внешние интерфейсы.Здесь hstack будет работать так же.np.append занимает 2 массива, так что будет работать - но слишком часто люди используют его неправильно.np.r_ - это другой интерфейс с другим синтаксисом.

Индексирование может быть более понятным с помощью:

In [423]: idx = (x-1)//2
In [424]: np.concatenate([values[0,:idx],values[1,idx:]])
Out[424]: array([1, 6, 7, 8])
0 голосов
/ 16 мая 2018

Вам не нужно разбивать и / или объединять. Просто используйте индексирование :

In [47]: values=np.array([[1,2,3,4],[5,6,7,8]])

In [48]: values[[[0], [1]],[[0, 1], [-2, -1]]]
Out[48]: 
array([[1, 2],
       [7, 8]])

Или Равель, чтобы получить сплющенную версию:

In [49]: values[[[0], [1]],[[0, 1], [-2, -1]]].ravel()
Out[49]: array([1, 2, 7, 8])

В качестве более общего подхода вы также можете использовать np.r_ следующим образом:

In [61]: x, y = values.shape

In [62]: values[np.arange(x)[:,None],[np.r_[0:y//2], np.r_[-y//2:0]]].ravel()
Out[62]: array([1, 2, 7, 8])
0 голосов
/ 16 мая 2018

Изменить форму, чтобы разделить второе измерение на два;сложите нужную часть.

a = np.array([[1,2,3,4],[5,6,7,8]])
b = a.reshape(a.shape[0], a.shape[1]//2, 2)
new_row = np.hstack([b[0,0,:], b[1,1,:]])
#new_row = np.hstack([b[0,0], b[1,1]])
0 голосов
/ 16 мая 2018

Попробуйте numpy.append

numpy.append Документация

np.append(values[temp0,0:int((x-1)/2)],values[temp1,int((x-1)/2):x+1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...