我试图用另一个数组替换一个数组,但只在原始数组为零的地方。这些数组的维度相等。
Array1 = [0, 2, 4, 2, 5, 0, 0, 2, 5]
Array2 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
我目前正在尝试使用下面的代码将 array2 叠加到数组 1 中,其中 array1 的值等于零。
Array1[Array1 .== 0] .= Array2
Run Code Online (Sandbox Code Playgroud)
从这里我希望得到以下...
Array1 = [1, 2, 4, 2, 5, 6, 7, 2, 5]
Run Code Online (Sandbox Code Playgroud)
但相反,我收到一个错误...
ERROR: DimensionMismatch("array could not be broadcast to match destination")
Run Code Online (Sandbox Code Playgroud)
有没有一种很好的方法来做到这一点,而无需一次遍历每个列表/数组一个元素?我正在处理非常大的数组,不知道这是否太慢。任何帮助表示赞赏。
这几乎可以按照您的方式轻松完成:
Array1[Array1 .== 0] .= Array2[Array1 .== 0]
Run Code Online (Sandbox Code Playgroud)
该部分Array1 .== 0正在创建一个长度与原始数组相同的零和一数组。不满足条件的地方打零,满足条件的地方打1。
当您执行以下操作时:
Array1 .= Array2
Run Code Online (Sandbox Code Playgroud)
您告诉 julia 将 Array2 按元素复制到 Array1 中,这是因为 Array1 和 Array2 具有相同的长度。但是当你尝试做
Array1[Array1 .== 0] .= Array2
Run Code Online (Sandbox Code Playgroud)
您告诉将 Array2 的每个元素放入 Array1 中的元素子集(满足您的条件的元素)。这会失败,因为数组的长度不同。如果你这样做
Array1[Array1 .== 0] .= Array2[Array1 .== 0]
Run Code Online (Sandbox Code Playgroud)
您现在告诉“将 Array1 满足条件的索引中 Array2 的所有元素复制到 Array1 中的相同位置”。现在这两个长度相同。
但是请注意,在 julia 中 for 循环很快,因此使用它们会很好。