Подтвердить что ты не робот

Что делает c-выражение подчеркивания c_` точно?

Кажется, это какая-то горизонтальная конкатенация, но я не могу найти документацию в Интернете. Вот минимальный рабочий пример:

In [1]: from numpy import c_
In [2]: a = ones(4)
In [3]: b = zeros((4,10))    
In [4]: c_[a,b]
Out[4]: 
array([[ 1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])
4b9b3361

Ответ 1

Используйте синтаксис IPython ?, чтобы получить дополнительную информацию:

In [2]: c_?
Type:       CClass
Base Class: <class 'numpy.lib.index_tricks.CClass'>
String Form:<numpy.lib.index_tricks.CClass object at 0x9a848cc>
Namespace:  Interactive
Length:     0
File:       /usr/lib/python2.7/dist-packages/numpy/lib/index_tricks.py
Docstring:
Translates slice objects to concatenation along the second axis.

This is short-hand for ``np.r_['-1,2,0', index expression]``, which is
useful because of its common occurrence. In particular, arrays will be
stacked along their last axis after being upgraded to at least 2-D with
1 post-pended to the shape (column vectors made out of 1-D arrays).

For detailed documentation, see `r_`.

Examples
--------
>>> np.c_[np.array([[1,2,3]]), 0, 0, np.array([[4,5,6]])]
array([[1, 2, 3, 0, 0, 4, 5, 6]])

Ответ 2

Мне потребовалось много времени, чтобы понять, но, кажется, я наконец-то понял.

Все, что вам нужно сделать, это добавить вдоль второй оси.

давай возьмем:

np.c_[np.array([1,2,3]), np.array([4,5,6])]

Но нет второй оси. Итак, мы мысленно добавляем один.

поэтому форма обоих массивов становится (3,1).

Таким образом, результирующая форма будет (3,1 + 1), которая (3,2). которая является формой результата -

array([[1, 4],
       [2, 5],
       [3, 6]])

Другой пример:

np.c_[np.array([[1,2,3]]), 0, 0, np.array([[4,5,6]])]

формы:

np.array([[1,2,3]])= 1,3

np.array([[4,5,6]])= 1,3

0 поэтому мы можем думать об этом как [[0]]= 1,1

Так что результат 1,3+1+1+3= 1,8

которая является формой результата: array([[1, 2, 3, 0, 0, 4, 5, 6]])

Ответ 3

Я знаю, что слишком поздно отвечать (около 7 лет после вопроса), но пишу это для людей, которые предпочитают пример чтению строк документации. Вышеуказанные ответы были неясны для меня, поэтому я попытался понять numpy c_ и r_ на следующем примере:

Рассмотрим следующий массив numpy:

a = array([[1, 2, 3], 
              [4, 5, 6]])

0th элемент по первой оси:

>>> a[0, :]
array([1, 2, 3])

Поэтому первая ось - это строка.

0th элемент по второй оси:

>>> a[:, 0]
array([1, 4])

Поэтому вторая ось является столбцом.

Теперь давайте рассмотрим еще один массив numpy:

b = array([[7, 8, 9],  
           [10, 11, 12]])

Мы можем объединить их вдоль первой оси (вдоль строк), используя _r следующим образом:

>>> r_[a, b]
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])

Таким образом, r_ укладывает массивы друг на друга.

Мы также можем объединить их вдоль второй оси (вдоль столбцов), используя c_ следующим образом:

>>> c_[a, b]
array([[ 1,  2,  3,  7,  8,  9],
       [ 4,  5,  6, 10, 11, 12]])

Итак, c_ помещает массивы рядом друг с другом.

Как сказано в документации, полезно создавать массивы - например, если у вас был цикл for или что-то, что строит массив столбец за столбцом, будет полезен помощник c_. То же самое, если вы строите это построчно, с помощью r_.

Надеюсь это поможет!

Ответ 4

На самом деле это не функция, это объект класса CClass.

it is "not a function, so takes no parameters

Выше говорится в официальном документе. вы можете проверить этот вопрос для деталей.

numpy.r_ не является функцией. Что это такое?

Ответ 5

Я бы объяснил это следующим образом. Он объединяет ваш первый массив с последним измерением (осью) вашего последнего массива в функции.

Например:

# both are 2 dimensional array
a = array([[1, 2, 3], [4, 5, 6]])
b = array([[7, 8, 9], [10, 11, 12]])

Теперь давайте взглянем на np.c_(a, b):

Сначала давайте посмотрим на форму:

Форма как a, так и b: (2, 3). Объединение a (2, 3) в последнюю ось b (3) с сохранением других осей без изменений (1) станет

(2, 3 + 3) = (2, 6)

Это новая форма.

Теперь давайте посмотрим на результат:

В b 2 элемента на последней оси:

1st: [7, 8, 9]
2nd: [10, 11, 12]

Добавление к нему означает:

1st item: [1,2,3] + [7,8,9] = [1,2,3,7,8,9]
2nd item: [4,5,6] + [10,11,12] = [4,5,6,10,11,12]

Итак, результат

[
  [1,2,3,7,8,9],
  [4,5,6,10,11,12]
]

Это форма (2, 6)

Ответ 6

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

Подумайте об этом так: если у вас есть серии данных по 30 записей в каждой, собранные в отдельные одномерные массивы, np.c_ объединяет эти серии, как в таблице Excel: бок о бок в отдельных столбцах по 30, а не расширяет первая серия.

Например, 2 начальных массива:

>>> arrayX = np.array([X1,X2...,X30])
array([X1, X2..., X30])
>>> arrayY = np.array([Y1,Y2...,Y30])
array([Y1, Y2..., Y30])

Давайте посмотрим, как их объединяет np.c_:

>>>arrayC = np.c_(arrayX, arrayY)
array([[X1, Y1],
       [X2, Y2],
       ...
       [X30, Y30]])

Видите, как это еще 30 записей? Теперь вы можете использовать второе измерение для навигации между рядами данных.

Документация documentation несколько загадочно гласит: "Преобразует объекты среза в конкатенацию по второй оси". Вторая ось чего? Полученный 2D массив они имеют ввиду. Непонятно, если вы не знаете, что это вариация np.r_, которая объединяется вдоль первой оси; а также если вы не думаете, что одномерный массив имеет другое измерение. Но с синтаксической точки зрения это так.

Сравните форму массивов, чтобы проиллюстрировать, что это значит:

>>> np.shape(arrayX)
(30,)
>>> np.shape(arrayY)
(30,)
>>> np.shape(arrayC)
(30,2)

Вы можете видеть, что 2-е измерение или ось созданы методом np.c_, и там происходит конкатенация. Для сравнения:

>>> arrayR = np.r_[array1,array2]
array([X1, X2..., X30, Y1, Y2..., Y30])
>>> np.shape(arrayR)
(60,)

Метод np.r_ объединяется в первом измерении или вдоль первой оси.