Назначить новый столбец, который использует экспоненциальную функцию для индекса массива numpy, динамически - PullRequest
0 голосов
/ 18 октября 2018

Допустим, у меня есть массив следующей природы:

x = arange(30).reshape((10,3))
x
Out[52]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11],
       [12, 13, 14],
       [15, 16, 17],
       [18, 19, 20],
       [21, 22, 23],
       [24, 25, 26],
       [27, 28, 29]])

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

array([[ 0,  1,  2,   2.718281828],
   [ 3,  4,  5,   7.389056099], ,
   [ 6,  7,  8,   20.08553692],
   [ 9, 10, 11,   54.59815003 ],
   [12, 13, 14,   148.4131591],
   [15, 16, 17,  403.4287935],
   [18, 19, 20,  1096.633158 ],
   [21, 22, 23,  2980.957987],
   [24, 25, 26,  8103.083928],
   [27, 28, 29,  22026.46579]])

Ответы [ 4 ]

0 голосов
/ 18 октября 2018

Вы можете построить такой столбец с помощью:

>>> np.exp(np.arange(1, 11))
array([2.71828183e+00, 7.38905610e+00, 2.00855369e+01, 5.45981500e+01,
       1.48413159e+02, 4.03428793e+02, 1.09663316e+03, 2.98095799e+03,
       8.10308393e+03, 2.20264658e+04])

Таким образом, мы можем сначала получить количество строк, а затем использовать np.hstack:

rows = x.shape[0]
result = np.hstack((x, np.exp(np.arange(1, rows+1)).reshape(-1, 1)))

Затем мы получим:

>>> np.hstack((x, np.exp(np.arange(1, 11)).reshape(-1, 1)))
array([[0.00000000e+00, 1.00000000e+00, 2.00000000e+00, 2.71828183e+00],
       [3.00000000e+00, 4.00000000e+00, 5.00000000e+00, 7.38905610e+00],
       [6.00000000e+00, 7.00000000e+00, 8.00000000e+00, 2.00855369e+01],
       [9.00000000e+00, 1.00000000e+01, 1.10000000e+01, 5.45981500e+01],
       [1.20000000e+01, 1.30000000e+01, 1.40000000e+01, 1.48413159e+02],
       [1.50000000e+01, 1.60000000e+01, 1.70000000e+01, 4.03428793e+02],
       [1.80000000e+01, 1.90000000e+01, 2.00000000e+01, 1.09663316e+03],
       [2.10000000e+01, 2.20000000e+01, 2.30000000e+01, 2.98095799e+03],
       [2.40000000e+01, 2.50000000e+01, 2.60000000e+01, 8.10308393e+03],
       [2.70000000e+01, 2.80000000e+01, 2.90000000e+01, 2.20264658e+04]])
0 голосов
/ 18 октября 2018

Чтобы создать один массив степеней e, начинающийся с единицы, вы можете использовать

powers = np.power(np.e, np.arange(10) + 1)

, который в основном принимает число e и переводит его в степени, заданные массивом np.arange(10) + 1то есть числа [1 ... 10].

Затем вы можете добавить это в качестве дополнительного столбца, сначала изменив его форму, а затем добавив, используя np.hstack.

powers = powers.reshape(-1, 1)
x = np.hstack((x, powers))
0 голосов
/ 18 октября 2018

Вычислить экспоненту легко:

ex = np.exp(np.arange(x.shape[0]) + 1)

То, что вы хотите с ней сделать, - это совсем другая история.Numpy не допускает гетерогенных массивов, в отличие, скажем, от панд.Таким образом, с простым ответом, ваш результат будет float64 (x наиболее вероятно int64 или int32):

x = np.concatenate((x, ex[:, None]), axis=1)

Альтернативой является использование структурированных массивов , что позволит вам сохранить типы ввода:

d = [('', x.dtype)] * x.shape[1] + [('', ex.dtype)]
out = np.empty(ex.shape, dtype=d)

Массовое присвоение немного сложнее, но может быть выполнено с помощью представления, полученного из необработанного ndarray конструктора:

view = np.ndarray(buffer=out, dtype=x.dtype, shape=x.shape, strides=(out.dtype.itemsize, x.dtype.itemsize))
view[...] = x

np.ndarray(buffer=out, dtype=ex.dtype, shape=ex.shape, strides=(out.dtype.itemsize,), offset=x.strides[0])[:] = ex

Более простым подходом было бы использование recarray, как @ PaulPanzer предлагает :

out = np.core.records.fromarrays([*x.T, ex])
0 голосов
/ 18 октября 2018

Попробуйте это:

import numpy as np

a = np.arange(30).reshape((10,3))
b = np.zeros((a.shape[0], a.shape[1] + 1))
b[:, :-1] = a
b[:, 3] = np.exp(np.arange(len(b)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...