Since arr
is 2d, iteration gives you the rows, not the elements.
Make a sample array:
In [347]: arr=np.arange(16).reshape(4,4)-10
In [348]: arr
Out[348]:
array([[-10, -9, -8, -7],
[ -6, -5, -4, -3],
[ -2, -1, 0, 1],
[ 2, 3, 4, 5]])
Iterate with some prints:
In [350]: for i in arr:
print(i)
print(i<0)
print((i<0).any())
.....:
result:
[-10 -9 -8 -7]
[ True True True True]
True
[-6 -5 -4 -3]
[ True True True True]
True
[-2 -1 0 1]
[ True True False False]
True
[2 3 4 5]
[False False False False]
False
The ValueError
results when you try to use that boolean array np.array([True, True, False, False])
in an if
statement. Applying all
or any
to the array reduces it to one scalar True/False value, which works in the if
statement.
You can apply the negative
test to the whole array, and apply all/any
to rows (or columns) – without iteration:
In [351]: arr<0
Out[351]:
array([[ True, True, True, True],
[ True, True, True, True],
[ True, True, False, False],
[False, False, False, False]], dtype=bool)
In [352]: (arr<0).any(axis=1)
Out[352]: array([ True, True, True, False], dtype=bool)
In [353]: (arr<0).all(axis=1)
Out[353]: array([ True, True, False, False], dtype=bool)
to get the non-negative values in the array, you can use this boolean mask (or its negative):
In [354]: arr[arr>=0]
Out[354]: array([0, 1, 2, 3, 4, 5])
Because there are different numbers of valid values in each row it can’t give you a 2d array.
But you can go back to iteration to get a list of values for each row. Here I use a list comprehension to do the iteration.
In [355]: [a[a>=0] for a in arr]
Out[355]:
[array([], dtype=int32),
array([], dtype=int32),
array([0, 1]),
array([2, 3, 4, 5])]
Серега_ 0 / 0 / 0 Регистрация: 09.11.2009 Сообщений: 6 |
||||
1 |
||||
в двумерном массиве анйти отрицательные числа09.11.2009, 15:30. Показов 2268. Ответов 2 Метки нет (Все метки)
нуно в двухмерном массиве найти отрицательные числа и заменить их нулем.
0 |
Давид Программист 1С 859 / 647 / 187 Регистрация: 03.03.2009 Сообщений: 1,154 |
||||
09.11.2009, 15:34 |
2 |
|||
Серега_,
1 |
0 / 0 / 0 Регистрация: 09.11.2009 Сообщений: 6 |
|
09.11.2009, 15:46 [ТС] |
3 |
спс большое
0 |
Здравствуйте. Помогите пожалуйста с решением задачи. Нужно создать двумерный массив и произвести с ним следующие операции:
Найти максимальный и минимальный элемент двумерного массива
Найти элементы массива, повторяющиеся более одного раза
Найти все отрицательные элементы в массиве, и заменить их на ноль
Сделать из массива выборку случайного элемента
Реализую так:
Код: Выделить всё
#include <stdio.h>
#include <stdlib.h>
int main()
{
int masotr [5];
int dvumas[4][4] = // Определение двумерного массива
{
{3,6,4,-2},
{7,2,-5,7},
{1,-1,9,8},
{6,-7,-4,4}
};
int i,k,j,v,;
printf("Что ищем?
1 – Максимальное и минимальное,
2 – Повторы более одного раза,
3 – Все отрицательные значения,
4 – Случайный элемент");
v = 0;
while(v==0)
{
scanf("%d",&v); printf("n");
if(v!=1&&v!=2&&v!=3&&v!=4) v=0;
}
if(v==1)
{
//Нахождение максимального и минимального элементов
int *maxel = &dvumas[0][0]; // Определение указателя на максимальный эл.
int *minel = &dvumas[0][0]; // Определение указателя на минимальный эл.
for( i = 0 ; i < 4 ; i++ )
{
if(dvumas[i][i] > *maxel ) maxel = &dvumas[i][i];
if(dvumas[i][i] < *minel ) minel = &dvumas[i][i];
};
printf("Maximum: %d %c",*maxel,'n');
printf("Minimum: %d %c",*minel,'n');
};
if(v==2)
{
//Нахождение элементов массива, встречающихся более одного раза
for (k=0;k<4;k++)
for (j=0;j<4;j++)
dvumas[masotr[k,j]]++;
for(i=0;i<5;i++)cout <<masotr[n]<<’’;
};
if(v==3)
{
// Найти все отрицательные элементы в массиве, и заменить их на ноль
for (k=0;k<4;k++)
for (j=0;j<4;j++){
if (array[ k,j ] > 0){
array[ k,j ] = 1;
}
}
};
system("pause");
return 0;
}
Проблема в решении последней задачи. Не знаю как ее начать решать. Как к ней вообще подступиться? С чего начать?
Получил следующее задание: отсортировать строки двумерного массива по количеству отрицательных элементов.
Суть в том , что могу найти и количество элементов и номер строки в котором они расположены , но не могу это связать с сортировкой самого массива(его строк)
int matrix[A][A]; //какая-то матрица
int array[A][2];
count=0;
c=0;
for ( i = 0; i < A; i++)
{
for ( j = 0; j < A; j++)
{
//находим отрицательные элементы
if (matrix[i][j]<0)
{
count++;
}
}
//записываем в первое значение номер строки
array[c][0]=i;
//во второе значение записываем количество отрицательных элементов
array[c][1]=count;
c++;
count=0;
}
записал значения в другой двумерный массив [A][2](#define A 6)
проблема состоит в том , что не могу придумать логически как отсортировать один массив по значениям.
По возможности подскажите способ проще.
задан 27 окт 2020 в 7:33
Разбейте задачу на этапы.
На первом этапе, запишите в промежуточный одномерный массив количества отрицательных элементов в строках.
На втором этапе, сортируйте этот массив, одновременно переставляя строки в выходной матрице.
Поздравляю, вы великолепны!
ответ дан 27 окт 2020 в 8:06
gbggbg
22.1k2 золотых знака32 серебряных знака52 бронзовых знака
помогите решить здачу. на Паскале. Дан двумерны массив. определить : есть ли в данном массиве отрицательный элемент.
Руслан Кантемиров
Ученик
(82),
на голосовании
11 лет назад
Голосование за лучший ответ
Manunich
Мудрец
(15831)
11 лет назад
var m:array[1..20] of array[1..20] of Integer;i,j,r:Integer;
begin
randomize;r:=0;
for i:=1 to 20 do for j:=1 to 20 do begin m[ i][j]:=Random(1000)-500;if m[ i][j]<0 then r:=1; end;
if r=0 then writeln(‘No’) else writeln(‘Yes’);
end.