Python: В numpy, как мне срезать столбец из массива без изменения формы? [Дубликат]

Один вкладыш (я не горжусь, но он выполняет эту работу):

class Myclass:
  def __init__(self):
      # do your stuff
      globals()[type(self).__name__] = lambda: self # singletonify
53
задан Joe Kington 11 January 2016 в 15:05
поделиться

3 ответа

Это, вероятно, проще всего сделать x[None, 10, :] или эквивалентно (но более читаемым) x[np.newaxis, 10, :].

Насколько я понимаю, это не по умолчанию, я считаю, что постоянно иметь массивы с размерами синглтона очень раздражает очень быстро. Я предполагаю, что numpy devs чувствовали то же самое.

Кроме того, многоуровневая передача широковещательных массивов очень хорошо, поэтому обычно нет оснований сохранять размерность массива, из которого вышел срез. Если бы вы это сделали, то такие вещи, как:

a = np.zeros((100,100,10))
b = np.zeros(100,10)
a[0,:,:] = b

, либо не работали, либо было бы намного сложнее реализовать.

(Или, по крайней мере, это моя догадка о рассуждениях numpy dev за снижением информации о размере при разрезе)

38
ответ дан Atcold 20 August 2018 в 23:33
поделиться
  • 1
    Это так неправильно ... – sebpiq 22 November 2012 в 15:54
  • 2
    На самом деле, x[10,:,None] возвращает массив формы (10,1), а не (1,10) .. – Lisa 10 May 2016 в 13:13
  • 3
    @Lisa: x[None, 10] будет делать то, что вы хотите. – naught101 17 June 2016 в 01:02
  • 4
    Ага. Поместите ваш None рядом с тускью, которую вы измельчите. – Mad Physicist 14 July 2016 в 19:36
  • 5
    В примере отсутствуют дополнительные скобки для кортежа при присваивании b; это должно быть b = np.zeros((100,10)). – Jerzy 17 March 2017 в 21:18

Другое решение -

X[[10],:]

или

I = array([10])
X[I,:]

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

51
ответ дан gnebehay 20 August 2018 в 23:33
поделиться
  • 1
    Это, безусловно, лучшее решение. – Will 3 February 2014 в 20:02
  • 2
    Это копирует данные массива – Per 17 March 2014 в 14:46
  • 3
    Это не всегда так. Смотрите: x = np.array([[1,2,3,4]]), если вы затем нарезаете его с помощью x[[0],[1,2]], вы получите одномерное array([2, 3]). Мое мнение заключается в выборе столбцов или векторов строк, чтобы сделать кусочек простым, а затем использовать np.reshape, поэтому в моем примере это будет np.reshape(x[0,[1,2]],[1,2]) – Alexander 14 September 2015 в 01:43
  • 4
    другие, должны знать точку с запятой в конце - важно, X[[10]] будет интерпретироваться как X[10], и форма будет меньше; аналогично, X[[10, 20]] == X[10, 20] и форма еще меньше – Ben Usman 15 June 2018 в 00:34
  • 5
    Warning : не смешивайте этот способ индексирования с целым индексированием! Если у вас a формы (10, 20, 30), то a[0, :, [0]] будет иметь форму (1, 20), а не (20, 1), потому что в последних индексах передается на a[[0], :, [0]], что часто не совсем то, что вы ожидаете! В то время как a[0, :, :1] даст вам (20, 1), как ожидалось. Более того, см. Выше комментарий для странного случая края с единственным индексом. В целом, похоже, что этот метод имеет слишком много краевых случаев. – Ben Usman 26 July 2018 в 19:14

Я нашел несколько разумных решений.

1) использовать numpy.take(X,[10],0)

2) использовать эту странную индексацию X[10:11:, :]

В идеале это должно по умолчанию. Я никогда не понимал, почему размеры падают. Но это обсуждение для numpy ...

17
ответ дан mindmatters 20 August 2018 в 23:33
поделиться
  • 1
    Вариант № 2 довольно классный. – Mad Physicist 14 July 2016 в 19:39
  • 2
    «размеры» отбрасываются при индексировании списков Python alist[0] и сохраняются при их разрезе. – hpaulj 13 May 2018 в 23:04
  • 3
    Вариант 2 (который может быть записан как slice(n, n+1) для извлечения индекса n) должен быть принятым ответом, поскольку он является единственным, который естественным образом распространяется на n-мерный случай. – norok2 20 August 2018 в 11:02
Другие вопросы по тегам:

Похожие вопросы: