Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 10.02.2021
Сообщений: 15

Дозаписать в массив А пару столбцов из B по соответствию значений в некоторых столбцах

10.02.2021, 21:26. Показов 1919. Ответов 27
Метки нет (Все метки)

Доброго времени суток!
Программирую пару дней, так что замучил уже друга, а задачку решить нужно, так что обращаюсь к вам, форумчане.
Даны два массива, которые уже представлены мной как списки списков, A - массив данных, в котором уже для каждого из четырех пар столбцов (координаты электродов) рассчитаны номера их пикетов, и B - массив координат всех электродов в формате (N, x, y,). Необходимо взять координаты x,y из массива B и дозаписать в конец массива A в соответствии с совпадением номера пикета, который расчитан для каждой из 4 пар координат в массиве A. Притом в массиве координат всего 72 строчки, а в массиве данных больше, потому что там координата меняется "типа" циклически - по определенному алгоритму
Вот так выглядит то, что я уже сделал:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import math
 
DataProt = []
 
 
def ElNumber(x):
    return x / 5 + 1
 
 
def GeomK(a, b, c, d, e, f, g, h):
    return 2 * math.pi / (1 / math.sqrt(math.pow(e - a, 2) + math.pow(f - b, 2)) - 1 / math.sqrt(
        math.pow(e - c, 2) + math.pow(f - d, 2)) + 1 / math.sqrt(
        math.pow(g - c, 2) + math.pow(h - d, 2)) - 1 / math.sqrt(math.pow(g - a, 2) + math.pow(h - b, 2)))
 
 
fileP = open('./Test2.dat', 'r')
linesP = fileP.readlines()
for i in range(len(linesP)):
    if i > 8 and i < len(linesP) - 6:
        FormatP = linesP[i].replace('\n', '').split('\t')
        # print(FormatP)
        floatP = [float(j) for j in FormatP]
        DataProt.append(floatP)
for i in DataProt:
    N1 = ElNumber(i[1])
    N2 = ElNumber(i[3])
    N3 = ElNumber(i[5])
    N4 = ElNumber(i[7])
    K = GeomK(i[1], i[2], i[3], i[4], i[5], i[6], i[7], i[8])
    i.extend([N1, N2, N3, N4, K])
# print(N1, N2, N3, N4)
#print(DataProt)
DataGeom = []
fileG = open('./Tes2ElCoord.txt', 'r')
linesG = fileG.readlines()
for i in range(len(linesG)):
    FormatG = linesG[i].replace('\n', '').split('\t')
    floatG = [float(j) for j in FormatG]
    DataGeom.append(floatG)
#print('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
print(DataGeom)
Дальше пытаюсь сделать что-то такое:
Python
1
2
3
4
5
for i in DataProt:
    for j in DataGeom:
            if i[10] == j[0]:
                DataProt.extend([j[1], j[2]])
print(DataProt)
Приводит это к ошибке: TypeError: 'float' object is not subscriptable

Помогите разобраться в проблеме и реализовать хотелку
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.02.2021, 21:26
Ответы с готовыми решениями:

Замена значений столбца по соответствию
Возможно не совсем точно дал название. Суть проблемы в следующем. Есть 2 файла, в первом указаны логин имейл ФИО и КОД. Вот собственно КОД...

Двумерный массив. Определение 2 минимальных значений в столбцах
Дан двумерный массив размером n * m, заполненный случайными числами. Определить, есть ли в данном массиве столбец, в котором имеется два...

Составить одномерный массив из средних арифметических значений элементов в столбцах матрицы
Вводятся две целые матрицы размером 25х20 и 20х30. Для той матрицы, у которой сумма отрицательных элементов матрицы больше, составить...

27
0 / 0 / 0
Регистрация: 10.02.2021
Сообщений: 15
12.02.2021, 12:19  [ТС]
Мне нужно, чтобы для каждого 2, 4, 6, и 8 столбцов массива посчитались значени в соответствии с формулой, которая у меня загнана в функцию (x/5 + 1), а также для столбцов 2-9 (за один раз) рассчитать ещё кое-что. Затем полученные столбцы со значениями присоединить к массиву, по которому проходят расчеты. Чтобы получилось как на картинке: в массиве появились дополнительные столбцы с рассчитанными значениями.
Миниатюры
Дозаписать в массив А пару столбцов из B по соответствию значений в некоторых столбцах  
0
Эксперт Python
 Аватар для dondublon
4659 / 2079 / 366
Регистрация: 17.03.2012
Сообщений: 10,194
Записей в блоге: 6
12.02.2021, 12:37
Цитата Сообщение от Vovtyai Посмотреть сообщение
Мне нужно, чтобы для каждого 2, 4, 6, и 8 столбцов массива посчитались значени
Присвоение значения:
Python
1
array[i, 2::2] = ...
Где 2::2 - индексация, от 2, до упора, с шагом 2. На месте "..." может быть константа или массив того же размера.
Это не numpy-специфика, это общее для питона.
Цитата Сообщение от Vovtyai Посмотреть сообщение
(x/5 + 1)
Если формула настолько простая, можно также сделать её векторно. Поробуйте что-то типа такого:
Python
1
(array[:, 0] + array[:, 1])/5+1
где array - 2d-массив, то бишь таблица.

Цитата Сообщение от Vovtyai Посмотреть сообщение
Затем полученные столбцы со значениями присоединить к массиву, по которому проходят расчеты. Чтобы получилось как на картинке: в массиве появились дополнительные столбцы с рассчитанными значениями.
Я сильно сомневаюсь, что вам надо присоединить. Лучше создать отдельный массив, потом с этим и работать проще будет. Связь по строкам соблюдаем, 1:1.
Если же очень хочется именно "присоединить", то два выхода. Либо сразу создать большой буфер с нулями в тех колонках, а заполнить их позже. Либо воспользоватся numpy.column_stack - соединяет колонки из имеющихся массивов.
0
0 / 0 / 0
Регистрация: 10.02.2021
Сообщений: 15
12.02.2021, 13:49  [ТС]
Я так и не понял, что вам надо. На всякий случай - numpy приспособлен, чтобы оперировать массивами, т. е. именно наборами чисел, а не одиночными значениями.
Окей. Напишу еще раз. Мне нужно, чтобы для столбцов 2, 4, 6, 8 исходного массива были вычислены номера пикетов в соответствии с заданной функцией, и дозаписаны в исходный массив в виде 4 столбцов. Если конкретизировать, то в столбцах массива (2,3), (4,5), ... содержатся координаты x, y. Притом координаты начинаются начинаются из точки (0, 0). Профиль прямолинейный и ориентирован вдоль оси x, поэтому координата y всегда равна нулю и не меняется. Приращение x всегда равно 5 м. Тогда функция x/5 + 1 при пересчете значения координаты x пикета даст нам номер его положения. Такого рода расчеты нужно произвести для 4 столбцов: для 2, 4, 6 и 8 b полученные в результате вычислений столбцы N1, N2, N3, N4 (массивы с размерностью (n, 1)) вставить в конец исходного массива друг за другом. Кроме этих расчетов нужно еще в соответствии с другой функцией вычислить коэффициент, который рассчитывается на основе всех 8 значений координат x, y, и полученный столбец коэффициентов также присоединить к исходному массиву.
На картинке вид исходного массива данных. Красным цветом справа намечено то, что должно получиться. Снизу красным подписана шапка.
В общем-то это уже сделано но для варианта со списками списков. Привожу код этого действа еще раз
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def ElNumber(x):
    return x / 5 + 1
 
 
def GeomK(a, b, c, d, e, f, g, h):
    return 2 * math.pi / (1 / math.sqrt(math.pow(e - a, 2) + math.pow(f - b, 2)) - 1 / math.sqrt(
        math.pow(e - c, 2) + math.pow(f - d, 2)) + 1 / math.sqrt(
        math.pow(g - c, 2) + math.pow(h - d, 2)) - 1 / math.sqrt(math.pow(g - a, 2) + math.pow(h - b, 2)))
fileP = open('./Test2.dat', 'r')
linesP = fileP.readlines()
for i in range(len(linesP)):
    if i > 8 and i < len(linesP) - 6:
        FormatP = linesP[i].replace('\n', '').split('\t')
        # print(FormatP)
        floatP = [float(j) for j in FormatP]
        DataProt.append(floatP)
#for i in DataProt:
    #N1 = ElNumber(i[1])
    #N2 = ElNumber(i[3])
    #N3 = ElNumber(i[5])
    #N4 = ElNumber(i[7])
    #K = GeomK(i[1], i[2], i[3], i[4], i[5], i[6], i[7], i[8])
    #i.extend([N1, N2, N3, N4, K])
DataPr = np.array(DataProt)
Закоменнтированный код - это как раз вычисления для списка списков, которые на выходе дают то, что я хочу. А я сейчас хочу этот же код адаптировать под вариант с массивами.
Миниатюры
Дозаписать в массив А пару столбцов из B по соответствию значений в некоторых столбцах  
0
Эксперт Python
 Аватар для dondublon
4659 / 2079 / 366
Регистрация: 17.03.2012
Сообщений: 10,194
Записей в блоге: 6
12.02.2021, 14:33
Vovtyai, вы ответили на прошлую реплику.
Прочитайте мой ответ, попробуйте применить. Вам надо разобраться с индексацией, прежде всего. Вы считали файлв 2d-массив?
0
0 / 0 / 0
Регистрация: 10.02.2021
Сообщений: 15
12.02.2021, 17:12  [ТС]
По итогу я сделал, что мне нужно, совместив с тем, что вы мне предлагали. Теперь у меня есть исходный массив значений DataPr и рассчитанные по нему значения порядковых номеров пикетов для каждой из 4 пар координат в 4 массивах N1, N2, N3, N4, а также значения коэффициентов в массиве K. Все 5 новых массивов имеют размерность n строк и 1 столбец. Теперь для каждого из массивов N1-N4 нужно провести сравнение первым столбцом из массива координат DataGeom и в случае совпадения значений записать координаты (столбцы 2, 3) в новые массивы. Файл геометрии содержит 72 строки и 3 столбца. Массивы номеров содержат столько же строк, сколько в файле данных и 1 столбец Привожу еще раз скрин файла с геометрией для наглядности.
Миниатюры
Дозаписать в массив А пару столбцов из B по соответствию значений в некоторых столбцах  
0
0 / 0 / 0
Регистрация: 10.02.2021
Сообщений: 15
12.02.2021, 17:23  [ТС]
С репликами честно говоря немного потерялся. Давно на классических форумах не сидел, и уже забыл, что тут нужно страницы переключать
0
Эксперт Python
 Аватар для dondublon
4659 / 2079 / 366
Регистрация: 17.03.2012
Сообщений: 10,194
Записей в блоге: 6
12.02.2021, 17:47
Отлично, но надо бы увидеть ваши массивы, фрагменты, чтобы понять, что есть и что нужно.
Цитата Сообщение от Vovtyai Посмотреть сообщение
Теперь для каждого из массивов N1-N4 нужно провести сравнение первым столбцом из массива координат DataGeom и в случае совпадения значений записать координаты (столбцы 2, 3) в новые массивы.
Вот это непотятно. Сравнение столбцом?
numpy поддерживает массивы в качестве индексов, если что.
Python
1
2
arr1 = np.array([10, 20, 30])
arr1[np.array([3,2,1,2,3])]
0
0 / 0 / 0
Регистрация: 10.02.2021
Сообщений: 15
12.02.2021, 22:43  [ТС]
С первым столбцом*
Опечатался
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.02.2021, 22:43

Составить одномерный массив из средних арифметических значений элементов в нечетных столбцах матрицы
вводятся две вещественные квадратные матрицы размером М*М и N*N .для той матрицы у которой сумма элементов,лежащих на главной диагонали...

Создать одномерный массив из средних арифметических значений элементов, расположенных в четных столбцах матрицы
Ввести двумерный массив целых чисел, содержащий m´n элементов. Создать одномерный массив из средних арифметических значений элементов,...

Сформировать массив натуральных чисел из M строк и N столбцов. Подсчитать сумму чисел в чётных столбцах
Сформировать массив натуральных чисел из M строк и N столбцов. Подсчитать сумму чисел в чётных столбцах массива. Ошибка: &quot;Compile...

Данный двумерный массив из двух строк и двадцати столбцов, максимальную сумму элементов в двух соседних столбцах
Данный двумерный массив из двух строк и двадцати столбцов, максимальную сумму элементов в двух соседних столбцах.

Дан двумерный массив из двух строк и пятнадцати столбцов. Найти минимальную сумму элементов в двух соседних столбцах
Помогите решить пожалуйста: Дан двумерный массив из двух строк и пятнадцати столбцов. Найти минимальную сумму элементов в двух...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
22. Подключение слоя системной динамики (потоковые диффуры): экономические метрики модели
anaschu 17.06.2026
Апдейт модели: финансовый контур, разделение затрат Продолжаю развивать модель рабочего коллектива на AnyLogic. В этот раз работа шла над агентом Экономика — финансовым SD-слоем модели. Задача:. . .
[golang] Insert Delete GetRandom O(1) (Leetcode: 380)
alhaos 16.06.2026
Insert Delete GetRandom O(1) Сложность: Medium Источник: LeetCode 380 Задача Реализовать структуру данных RandomizedSet, которая поддерживает следующие операции за O(1) в среднем:
Свет в конце тоннеля
kumehtar 16.06.2026
Поймал себя на одной мысли. Раньше мне всегда казалось неправильным жить без чёткого понимания, куда всё идёт. Будто я иду по дороге судьбы, но не знаю, куда она ведёт. А раз не знаю — значит,. . .
[golang] Реализация стека с поддержкой получения минимального элемента за O(1)
alhaos 16.06.2026
Min Stack Сложность: Medium Источник: LeetCode 155 Задача: Реализовать стек который поддерживает push, pop, top и получение минимального элемента за O(1). Методы:
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru