如何在不使用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循环吗?
答案 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
甚至更好,使用正确的(从零开始)索引初始化您的row
和col
数组。
答案 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))