создать цепочку объектов используя цикл

С помощью numpy вы можете передать срез для каждого компонента индекса, поэтому ваш пример x[0:2,0:2] выше работает.

Если вы просто хотите равномерно пропускать столбцы или строки, вы можете передать срезы с тремя компонентами (например, start, stop, step).

Опять же, для вашего примера выше:

>>> x[1:4:2, 1:4:2]
array([[ 5,  7],
       [13, 15]])

В основном это: срез в первом измерении, с началом с индексом 1, остановка, когда индекс равен или больше 4, и добавить 2 к индексу в каждом проходе. То же самое для второго измерения. Опять же: это работает только для постоянных шагов.

Синтаксис, который вам нужно сделать во всем, что-то совсем другое - фактически x[[1,3]][:,[1,3]] создает новый массив, включающий только строки 1 и 3 из исходного массива (сделано с частью x[[1,3]]), а затем повторно разрезать это: создание третьего массива - включая только столбцы 1 и 3 предыдущего массива.

1
задан Saffer 3 March 2019 в 15:43
поделиться

2 ответа

Я думаю, что изучение функционального программирования поможет вам здесь.

Я использовал функцию pipe из интернет-ссылки ниже, но вы можете использовать lodash / Ramda / underscore или любую другую вашу любимую библиотеку util.

две основные концепции, которые я здесь использую, - это карри и пайпинг.

Что такое «каррирование»? Карринг - это когда вы разбиваете функцию, которая принимает несколько аргументов, на ряд функций, которые принимают часть аргументов, мы также используем карринг, который возвращение функции из другой функции для создания новых функций.

https://medium.com/@venomnert/pipe-function-in-javascript-8a22097a538e Функция конвейера принимает n последовательностей операций; в которой каждая операция принимает аргумент; обработать это; и выдает обработанный вывод в качестве ввода для следующей операции в последовательности. Результатом конвейерной функции является функция, представляющая собой объединенную версию последовательности операций.

здесь мы берем массив, создаем новый массив функций, которые мы хотим применить к значению.

Итак, мы хотим выполнить загрузку объединений в БД.

join => con => con.innerJoin(join);

принимает значение, то есть «table1» и возвращает функцию, которая принимает соединение БД, которое вызывает соединение и возвращает следующее.

const joins = toJoin.map(join => con => con.innerJoin(join)); и это создает массив функций для передачи в канал.

const db = ({
  select: function (field) {
    console.log('select', field)
    return db
  },
  from: function (table) {
    console.log('from', table)
    return db;
  },
  innerJoin: function (join) {
    console.log('innerJoin', join)
    return db;
  }
});

const _pipe = (a, b) => (arg) => b(a(arg));
const pipe = (args) => [].slice.apply(args).reduce(_pipe);

function joinInnerMultiple(table, fields, toJoin) {
  const joins = toJoin.map(join => con => con.innerJoin(join));

  return pipe(joins)(db.select(fields).from(table)); 
}


joinInnerMultiple("User", "uuid", ["table1", "table2", "table3", "table4", "table5"])

0
ответ дан Joe Warner 3 March 2019 в 15:43
поделиться

Цепочка работает так, что каждый из этих методов возвращает объект, у которого следующий метод является свойством. Это означает, что вы можете использовать что-то вроде reduce() , чтобы продолжать вызывать следующий метод для объекта, возвращенного из предыдущего.

reduce() принимает исходный объект, который вы можете передать, чтобы все пошло на смену. Примерно так:

var tables = ["table1","table2","table3"]
let res = tables.reduce((res, table) => res.innerJoin(table), db.select(fields).from(table))

Чтобы понять, как это работает, мы можем создать поддельный объект db со всеми методами, которые возвращают объект для следующего метода в цепочке. Метод innerJoin просто добавляет аргумент в свойство value:

// fake db object with these methods
const db = {
  select(t) {
    this.val = [] // initialize val
    return this
  },
  from(t) {
    return this
  },
  innerJoin(name) {
    this.val.push("Added: " + name)
    return this
  }
}

var tables = ["table1","table2","table3"]
// call innerjoin for each of the tables
// this is the same as chaining them
let res = tables.reduce((res, table) => res.innerJoin(table), db.select().from())

// values where accumlated in the val property
console.log(res.val)

0
ответ дан Mark Meyer 3 March 2019 в 15:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: