Python设置多行的矩阵值,每行包含多个不同的列而不用for循环

时间:2016-02-23 08:25:20

标签: python matrix indexing

如何在不使用for循环的情况下将相同的值设置为多行和每行具有不同列号的矩阵? 例如对于矩阵a:

var ret = (str.indexOf('one') !== -1);

我想设置[1,1],a [1,2],[2,1],[2,3],[3,2],[3,3]相同的价值。 我知道用于循环:

var markerGroups = {
    "Fire": {
        markers: [],
        visible: true
    },
    "Flood": {
        markers: [],
        visible: true
    },
    "Terrorism": {
        markers: [],
        visible: true
    },
    "station": {
        markers: [],
        visible: true
    }
};


setInterval(reload, 10000);

function createMarker(map) {
    var type;
    for (var i = 0; i < _newPointA['point'].length; i++) {
        type = _newPointA['type'][i];
        var icon = customIcons[type] || {};
        var myLatLng = new google.maps.LatLng(_newPointA['lat'][i], _newPointA['long'][i]);
        var marker = new google.maps.Marker({
            position: myLatLng,
            map: map,
            icon: icon.icon
        });
        newMarker.push(marker);
        bindInfoWindow(marker, map, infoWindow, _newPointA['html'][i]);
        if (!markerGroups[type]) {
            markerGroups[type] = {
                markers: [],
                visible: true
            };
        }

        marker.setVisible(markerGroups[type].visible);
        markerGroups[type].markers.push(marker);
    }
}


function toggleGroup(type) {
    // toggle the 'visible' property for this type
    markerGroups[type].visible = !markerGroups[type].visible;

    for (var i = 0; i < markerGroups[type].markers.length; i++) {
        markerGroups[type].markers.[i].setVisible(markerGroups[type].visible);
    }
}

function reload() {
    for (var i = 0; i < newMarker.length; i++) {

        newMarker[i].setMap(null);
    }

    // Reset the markers array
    newMarker = [];

    // Call set markers to re-add markers
    createMarker(map);
}

但是,无论如何都没有for循环吗?

3 个答案:

答案 0 :(得分:1)

使用numpy,您可以避免循环:

import numpy as np
from numpy.matlib import repmat

a = np.array([[1,2,3],
              [8,2,9],
              [1,8,7]])

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

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

row = repmat(row,1,col.shape[1])

setvalue = 0
a[row.ravel(),col.ravel()] = setvalue

然而,重要的是要注意python索引从0开始,所以你应该实际做

a[row-1,col-1] = setvalue

甚至更好,使用正确的(从零开始)索引初始化您的rowcol数组。

答案 1 :(得分:0)

案例1:使用列表理解

你可以这样做:

value = 2
col_length = 3
line_length = 3
a = [[value for x in range(col_length)] for x in range(line_length)]

如果您打印a

[[2, 2, 2], [2, 2, 2], [2, 2, 2]]

编辑:案例2:使用map()

我不习惯这个。但是你可以在性能方面找到更多关于它的信息here。一般想法:当使用一个函数而没有lambda表达式时,它似乎更快。

答案 2 :(得分:-1)

你必须使用for循环。

通常你想在遵循功能范例时避免for循环(通过使用comprehesions),通过构建新实例而不是改变旧实例。因为你的目标是改变旧的,你需要一个循环。你能做的最好的事情是将它包装在一个函数中:

def set_items_to(mx, indices, value=0):
  for row,cols in indices:
    for col in cols:
      mx[row, col] = value

a = matrix([[1,2,3],[4,5,6],[7,8,9]])
set_items_to(a, [
  [0, [0,1]],
  [1, [0,2]],
  [2, [1,2]]
], setvalue)

修改

如果它是一个编程挑战,有一些方法可以通过使用其中一个内置的聚合器函数来实现它,而无需显式的for循环。但是这种方法不会使代码更清晰也更短。只是为了完整性,它看起来像这样:

def set_items_to(mx, indices, value=0):
  sum(map(lambda item: [0,
    sum(map(lambda col: [0,
      mx.__setitem__((item[0], col), value)
    ][0], item[1]))
  ][0], indices))