“Клонирование” строки или векторов - столбцов

Ваша ошибка в той части, где вы делаете последний перенос из ячеек, в которых есть числа с более чем одной цифрой:

        if(res[i] > 9) {
            res[i - 1] += (res[i] / 10) % 10; //left-digit
            res[i] = res[i] % 10; //right-digit
        }

Здесь вы предполагаете, что res[i] имеет большинство двух цифр (не больше 99). Предположение не обосновано. Я попытался умножить 99 999 999 999 (одиннадцать цифр) на себя, используя вашу программу, и на этом этапе res[12] содержал 100. Таким образом, (res[i] / 10) % 10 оценивается как 0, и вы не переносите что-либо на res[11] или res[10], как следует.

Полагаю, мне следует оставить это для себя, чтобы найти хорошее решение.

Редактировать: Для удобства чтения это ваше собственное исправление из вашего комментария, отформатированное и с отступом:

    for (int i = res.length - 1; i >= 0; i--) {
        if (res[i] > 9) {
            if (res[i] > 99) {
                res[i - 1] += ((res[i] / 100) % 10) * 10; // first digit (*10)
                res[i - 1] += (res[i] / 10) % 10; // second digit
            } else {
                res[i - 1] += (res[i] / 10) % 10; // left-digit
            }
            res[i] = res[i] % 10; // right-digit
        }
    }
136
задан Neuron 11 November 2019 в 01:53
поделиться

4 ответа

Вот изящный питонический способ сделать это:

>>> array([[1,2,3],]*3)
array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]])

>>> array([[1,2,3],]*3).transpose()
array([[1, 1, 1],
       [2, 2, 2],
       [3, 3, 3]])

проблема с [16] , похоже, в том, что транспонирование не влияет на массив. вам, вероятно, нужна матрица:

>>> x = array([1,2,3])
>>> x
array([1, 2, 3])
>>> x.transpose()
array([1, 2, 3])
>>> matrix([1,2,3])
matrix([[1, 2, 3]])
>>> matrix([1,2,3]).transpose()
matrix([[1],
        [2],
        [3]])
68
ответ дан 23 November 2019 в 23:37
поделиться

Если Вы имеете кадр данных панд и хотите сохранить dtypes, даже categoricals, это - быстрый способ сделать это:

import numpy as np
import pandas as pd
df = pd.DataFrame({1: [1, 2, 3], 2: [4, 5, 6]})
number_repeats = 50
new_df = df.reindex(np.tile(df.index, number_repeats))
0
ответ дан 23 November 2019 в 23:37
поделиться

Прежде всего, обратите внимание, что с операциями широковещательной передачи numpy обычно не требуется дублировать строки и столбцы. См. Описания this и this .

Но для этого, repeat и newaxis , вероятно, являются лучшим способом

In [12]: x = array([1,2,3])

In [13]: repeat(x[:,newaxis], 3, 1)
Out[13]: 
array([[1, 1, 1],
       [2, 2, 2],
       [3, 3, 3]])

In [14]: repeat(x[newaxis,:], 3, 0)
Out[14]: 
array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]])

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

In [15]: x = array([[1, 2, 3]])  # note the double brackets

In [16]: (ones((3,1))*x).transpose()
Out[16]: 
array([[ 1.,  1.,  1.],
       [ 2.,  2.,  2.],
       [ 3.,  3.,  3.]])
36
ответ дан 23 November 2019 в 23:37
поделиться

Используйте numpy.tile :

>>> tile(array([1,2,3]), (3, 1))
array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]])

или для повторяющихся столбцов:

>>> tile(array([[1,2,3]]).transpose(), (1, 3))
array([[1, 1, 1],
       [2, 2, 2],
       [3, 3, 3]])
259
ответ дан 23 November 2019 в 23:37
поделиться
Другие вопросы по тегам:

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