Изменения объекта непреднамеренно [дублировать]

ffill теперь имеет свой собственный метод pd.DataFrame.ffill

df.ffill()

     0    1    2
0  1.0  2.0  3.0
1  4.0  2.0  3.0
2  4.0  2.0  9.0

39
задан roberto duran 6 November 2009 в 10:21
поделиться

4 ответа

Существует два хороших способа копирования массива - использовать клон и System.arraycopy().

Вот как использовать клон для 2D-случая:

int [][] myInt = new int[matrix.length][];
for(int i = 0; i < matrix.length; i++)
    myInt[i] = matrix[i].clone();

Для системы. arraycopy (), вы используете:

int [][] myInt = new int[matrix.length][];
for(int i = 0; i < matrix.length; i++)
{
  int[] aMatrix = matrix[i];
  int   aLength = aMatrix.length;
  myInt[i] = new int[aLength];
  System.arraycopy(aMatrix, 0, myInt[i], 0, aLength);
}

У меня нет теста, но я могу поспорить с моими 2 центами, что они быстрее и меньше склонны к ошибкам , чем делают это сам. Особенно, System.arraycopy(), поскольку он реализован в собственном коде.

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

Изменить: исправлена ​​ошибка.

69
ответ дан 7 revs, 7 users 65% 22 August 2018 в 01:30
поделиться
  • 1
    Также может использоваться Arrays.copyOf () – Pete Kirkham 6 November 2009 в 11:40
  • 2
    Пит прав. Но Arrays.copyOf () использует System.arraycopy () с над головой для предположения, что длина результата может не совпадать с оригиналом. В этом случае мы точно знаем размер результата, поэтому гораздо эффективнее использовать clone () и System.arraycopy (), поскольку они являются родными. Тем не менее, Arrays.copyOf () может также использоваться. – NawaMan 6 November 2009 в 12:05
  • 3
    @PeteKirkham Arrays.copyOf () не выполняет глубокую копию 2d-матрицы. Он просто относится к тем же массивам второго измерения. – Sachin Verma 26 February 2018 в 13:27
  • 4
    @SachinVerma да. Вместо того, чтобы делать новый, а затем и arraycopy во втором примере, вы делаете один вызов библиотеки, который делает оба. – Pete Kirkham 26 February 2018 в 14:58

Вы не инициализируете локальный 2D-массив.

int[][] myInt = new int[matrix.length][];
for(int i = 0; i < matrix.length; i++)
{
  myInt[i] = new int[matrix[i].length];
  for (int j = 0; j < matrix[i].length; j++)
  {
    myInt[i][j] = matrix[i][j];
  }
}
6
ответ дан Amarghosh 22 August 2018 в 01:30
поделиться

Можно использовать потоки в Java 8 для копирования 2D-массива.

@Test
public void testCopy2DArray() {
   int[][] data = {{1, 2}, {3, 4}};
   int[][] dataCopy = Arrays.stream(data)
             .map((int[] row) -> row.clone())
             .toArray((int length) -> new int[length][]);

   assertNotSame(data, dataCopy);
   assertNotSame(data[0], dataCopy[0]);
   assertNotSame(data[1], dataCopy[1]);

   dataCopy[0][1] = 5;
   assertEquals(2, data[0][1]);
   assertEquals(5, dataCopy[0][1]);
}
11
ответ дан NickF 22 August 2018 в 01:30
поделиться
  • 1
    Для одного лайнера - свернуть все lambdas на ссылки метода Arrays.stream(data).map(int[]::clone).toArray(int[][]::new);. Но обратите внимание, что для огромных массивов native System.arraycopy должен быть (возможно?) Быстрее, если только вы parallel() не используете ваш поток. – NIA 3 October 2016 в 11:55

вы можете так же кодировать myInt = matrix.clone ();

-11
ответ дан valli 22 August 2018 в 01:30
поделиться
  • 1
    Это создаст матрицу, которая разделяет массивы строк в качестве оригинала – Pete Kirkham 6 November 2009 в 11:39
Другие вопросы по тегам:

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